본문 바로가기
ICIA 수업일지

2021.09.24 수업일지(안드로이드 개발 기초, SQLite)

by 주성씨 2021. 9. 24.

- 안드로이드 개발 기초

위와 같이 프로젝트 이름과 프로젝트 폴더를 설정해준다.

 

- 에뮬레이터 실행을 위해 아래 경로에 따라 안드로이드 31을 30으로 수정해준다.

- gradle scripts\build.gradle(module.app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"

    defaultConfig {
        applicationId "com.example.ex02"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

.....

 

- src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

 

- 새로운 view를 생성한다.

- src/main/res/layout/(new)item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#2196F3"
    android:padding="20sp"
    android:layout_margin="10sp"
    android:elevation="10sp">
    <ImageView
        android:id="@+id/img"
        android:layout_width="70sp"
        android:layout_height="70sp"
        android:src="@mipmap/ic_launcher_round"
        android:layout_marginRight="20sp"/>
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="홍"
        android:textSize="20sp"
        android:textColor="#FFFFFF"
        android:layout_toRightOf="@id/img"/>
    <TextView
        android:id="@+id/tel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="010-0101-0101"
        android:textSize="20sp"
        android:textColor="#FFFFFF"
        android:layout_toRightOf="@+id/img"
        android:layout_below="@id/name"/>
    <TextView
        android:id="@+id/address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="인천시 미추홀구"
        android:textColor="#FFFFFF"
        android:layout_toRightOf="@id/img"
        android:layout_below="@id/tel"/>
</RelativeLayout>

 

- src/main/java/com/example/ex02/MainActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        R=res, layout=layout,
        setContentView(R.layout.item);
    }
}

 

확인

 

- 새로운 클래스를 생성하겠다.

- src/main/java/com/example/ex02/Person.java

 

package com.example.ex02;

public class Person {
    private String image;
    private String name;
    private String address;
    private String tel;
    private int photo;

    // 생성자 생성
    public Person(int photo, String name, String address, String tel) {
        this.photo = photo;
        this.name = name;
        this.address = address;
        this.tel = tel;
    }

    // 겟터셋터 생성
    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public int getPhoto() {
        return photo;
    }

    public void setPhoto(int photo) {
        this.photo = photo;
    }

    @Override
    public String toString() {
        return "Person{" +
                "image='" + image + '\'' +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", tel='" + tel + '\'' +
                ", photo=" + photo +
                '}';
    }
}

 

- src/main/java/com/example/ex02/MainActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ListView list;
    ArrayList<Person> array;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        R=res, layout=layout,
        setContentView(R.layout.activity_main);

        // ListView 생성
        list = findViewById(R.id.list);
        // Data 생성
        Person person = new Person(R.drawable.img01, "송중기","인천시 부평구 부평동", "010-0101-01001");
        array.add(person);
        person = new Person(R.drawable.img03,"조승우","서울시 관악구 신립동","010-0202-0202");
        array.add(person);
        person = new Person(R.drawable.img04,"지성","강원도 원주시","033-0303-0303");
        array.add(person);
        person = new Person(R.drawable.img05,"환빈","충청북도 청주시","041-0505-0505");
        array.add(person);

    }
}

 

 

- 에뎁터는 리스트뷰에 연결하기 위한 데이터를 연결하기 위한 수단이라고 생각하면 쉽다.

- 어뎁터를 새로 생성해보겠다.

 

- src/main/java/com/example/ex02/MainActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ListView list;
    ArrayList<Person> array = new ArrayList();
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        R=res, layout=layout,
        setContentView(R.layout.activity_main);

        // ListView 생성
        list = findViewById(R.id.list);

        // Data 생성
        Person person = new Person(R.drawable.img01, "송중기","인천시 부평구 부평동", "010-0101-01001");
        array.add(person);
        person = new Person(R.drawable.img03,"조승우","서울시 관악구 신립동","010-0202-0202");
        array.add(person);
        person = new Person(R.drawable.img04,"지성","강원도 원주시","033-0303-0303");
        array.add(person);
        person = new Person(R.drawable.img05,"환빈","충청북도 청주시","041-0505-0505");
        array.add(person);

        // adapter 생성
        adapter = new MyAdapter();
        list.setAdapter(adapter);
    }

    public class MyAdapter extends BaseAdapter {

        // 위 array 사이즈로 갯수를 지정한다.
        @Override
        public int getCount() {
            return array.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        // 중요
        @Override
        public View getView(int position, View view, ViewGroup parent) {
            view = getLayoutInflater().inflate(R.layout.item, parent, false);
            //
            Person person = array.get(position);
            ImageView img = view.findViewById(R.id.img);
            img.setImageResource(person.getPhoto());
            TextView name = view.findViewById(R.id.name);
            name.setText(person.getName());
            TextView address = view.findViewById(R.id.address);
            address.setText(person.getAddress());
            TextView tel = view.findViewById(R.id.tel);
            tel.setText(person.getTel());
            return view;
        }
    }

}

 

확인

 

- 삭제를 해보도록 하겠다.

제공되는 vector 이미지

 

- src/main/res/drawable/(new)ic_remove.xml

- src/main/res/layout/item.xml

.....
    <ImageView
        android:id="@+id/remove"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_remove"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

 

 

- src/main/java/com/example/ex02/MainActivity.java

.....
        // 중요
        @Override
        public View getView(final int position, View view, ViewGroup parent) {
            view = getLayoutInflater().inflate(R.layout.item, parent, false);
            Person person = array.get(position);

            ImageView img = view.findViewById(R.id.img);
            img.setImageResource(person.getPhoto());
            TextView name = view.findViewById(R.id.name);
            name.setText(person.getName());
            TextView address = view.findViewById(R.id.address);
            address.setText(person.getAddress());
            TextView tel = view.findViewById(R.id.tel);
            tel.setText(person.getTel());
			// new
            ImageView remove = view.findViewById(R.id.remove);
            remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,String.valueOf(position),Toast.LENGTH_SHORT).show();
                }
            });
            return view;
        }
.....

 

확인

 

 

.....
            ImageView remove = view.findViewById(R.id.remove);
            remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder box = new AlertDialog.Builder(MainActivity.this);
                    box.setTitle("질의");
                    box.setMessage(person.getName()+" 을(를) 삭제하시겠습니까?");
                    box.setPositiveButton("예",null);
                    box.setNegativeButton("아니오",null);
                    box.show();
                }
            });
            return view;
.....

 

확인

 

- 이제 삭제가 되도록 하겠다.

.....
            remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder box = new AlertDialog.Builder(MainActivity.this);
                    box.setTitle("질의");
                    box.setMessage(person.getName()+" 을(를) 삭제하시겠습니까?");
                    box.setNegativeButton("아니오",null);
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            array.remove(position);
                            adapter.notifyDataSetChanged();
                        }
                    });
                    box.show();
                }
            });
.....

 

확인

 

 

- 이제 DB랑 연결하여 작업해보도록 하겠다.

- 일기장을 위한 어플을 만들어보도로고 하겠다.

- src/main/java/com/example/ex02/(new)DiaryActivity.java

- src/main/AndroidManifest.xml

.....
        <activity android:name=".DiaryActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
.....

 

- sqlite이라는 로컬DB를 이용하겠다.

- src/main/java/com/example/ex02/(new)DiaryDB.java

- 생성자와 메서드를 추가한다.

- table을 생성하고 데이터를 인서트하는 문을 넣는다.

package com.example.ex02;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class DiaryDB extends SQLiteOpenHelper {

    public DiaryDB(@Nullable Context context) {
        super(context, "diary.db", null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table diary(_id integer primary key autoincrement, wdate text, subject text, content text);");
        db.execSQL("insert into diary(wdate, subject, content) values('2017/10/10', '안드로이드', '안드로이드 어렵지 않아요!');");
        db.execSQL("insert into diary(wdate, subject, content) values('2017/10/10', '장마시작', '장마가 시작되었다.');");
        db.execSQL("insert into diary(wdate, subject, content) values('2017/10/12', '생일파티', '정원이 생일 축하 파티를 했다.');");
        db.execSQL("insert into diary(wdate, subject, content) values('2017/10/13', '중간고사', '중간고사 시험을 아주 잘 봤다.');");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

 

- 다이어리엑티비티를 시작했을때 DB를 생성하도록 하겠다.

- src/main/java/com/example/ex02/DiaryActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class DiaryActivity extends AppCompatActivity {

    DiaryDB diary;
    SQLiteDatabase db;

    // db select한 정보를 커서에 넣는다.
    Cursor cursor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diary);

        // this = 현재 엑티비티
        diary = new DiaryDB(this);
        // diary 오픈 순간 테이블 생성
        db = diary.getWritableDatabase();
        cursor = db.rawQuery("select * from diary order by _id desc", null);
        while(cursor.moveToNext()){

        }
    }
}

 

DB 생성 확인

 

- src/main/res/layout/(new)item_diary.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#3F51B5"
    android:padding="20sp"
    android:layout_margin="10sp">
    <TextView
        android:id="@+id/subject"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이곳에는 제목이 들어갑니다."
        android:textColor="#FFFFFF"
        android:textSize="15sp"/>
    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이곳에는 내용이 들어갑니다. 이곳에는 내용이 들어갑니다. 이곳에는 내용이 들어갑니다."
        android:textColor="#FFFFFF"
        android:textSize="10sp"
        android:lines="1"
        android:layout_below="@id/subject"/>
    <TextView
        android:id="@+id/wdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2021-09-24"
        android:textColor="#FFFFFF"
        android:textSize="10sp"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

 

확인

 

- CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.

- src/main/java/com/example/ex02/DiaryActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;

import org.w3c.dom.Text;

public class DiaryActivity extends AppCompatActivity {

    DiaryDB diary;
    SQLiteDatabase db;

    // db select한 정보를 커서에 넣는다.
    Cursor cursor;

    // 전역변수 생성
    ListView list;
    MyAdater adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diary);

        // this = 현재 엑티비티
        diary = new DiaryDB(this);
        // diary 오픈 순간 테이블 생성
        db = diary.getWritableDatabase();
        cursor = db.rawQuery("select * from diary order by _id desc", null);

        // ListView 생성
        list=findViewById(R.id.list);

        // adapter 생성
        adapter = new MyAdater(this,cursor);
        list.setAdapter(adapter);
    }

    // CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.
    public class MyAdater extends CursorAdapter{
        public MyAdater(Context context, Cursor c) {
            super(context, c);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return getLayoutInflater().inflate(R.layout.item_diary, parent, false);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            TextView subject = view.findViewById(R.id.subject);
            TextView wdate = view.findViewById(R.id.wdate);
            TextView content = view.findViewById(R.id.content);

            subject.setText(cursor.getString(2));
            wdate.setText(cursor.getString(1));
            content.setText(cursor.getString(3));

        }
    }
}

 

확인

 

- 타이틀 변경, 이미지 삽입

.....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diary);

        // 타이틀 변경
        getSupportActionBar().setTitle("일기장");
        // 타이틀 옆에 이미지 삽입
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // vector asset으로 drawable에 이미지 삽입
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_baseline_book_24);

        // this = 현재 엑티비티
        diary = new DiaryDB(this);
        // diary 오픈 순간 테이블 생성
        db = diary.getWritableDatabase();
        cursor = db.rawQuery("select * from diary order by _id desc", null);

        // ListView 생성
        list=findViewById(R.id.list);

        // adapter 생성
        adapter = new MyAdater(this,cursor);
        list.setAdapter(adapter);
    }
.....

 

확인

 

 

- floating button widget을 이용해보겠다.

- 라이브러리를 추가하겠다.

위치

- build.gradle

implementation 'com.android.support:design:30.0.0'

 추가

.....
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    implementation 'com.android.support:design:30.0.0'
}

 

- src/main/java/com/example/ex02/InsertActivity.java

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DiaryActivity">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="20sp"
        android:layout_marginRight="20sp"
        android:backgroundTint="#E91E63"
        android:src="@drawable/ic_baseline_add_24"/>
</RelativeLayout>

 

- src/main/java/com/example/ex02/(new)InsertActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class InsertActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("일기쓰기");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

 

- src/main/java/com/example/ex02/DiaryActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import org.w3c.dom.Text;

public class DiaryActivity extends AppCompatActivity {

    DiaryDB diary;
    SQLiteDatabase db;

    // db select한 정보를 커서에 넣는다.
    Cursor cursor;

    // 전역변수 생성
    ListView list;
    MyAdater adapter;
    //new
    FloatingActionButton add;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_diary);

        // 타이틀 변경
        getSupportActionBar().setTitle("일기장");
        // 타이틀 옆에 이미지 삽입
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // vector asset으로 drawable에 이미지 삽입
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_baseline_book_24);

		//new
        add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(DiaryActivity.this, InsertActivity.class);
                startActivity(intent);
            }
        });
.....

 

- src/main/res/layout/activity_insert.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".InsertActivity"
    android:padding="20sp">
    <TextView
        android:id="@+id/wdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2021-09-24"/>
    <ImageView
        android:id="@+id/calender"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_calendar"
        android:layout_alignParentRight="true"/>
    <EditText
        android:id="@+id/subject"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:hint="제목을 입력하세요."
        android:layout_below="@id/wdate"
        android:padding="10sp"/>
    <EditText
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="15sp"
        android:hint="내용을 입력하세요."
        android:layout_below="@id/subject"
        android:gravity="top"
        android:padding="10sp"
        android:background="null"/>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:backgroundTint="#FF3A3A"
        android:src="@drawable/ic_add"
        app:borderWidth="0sp"/>
</RelativeLayout>

 

확인

 

 

- 이제 다이어리 테이블에 insert 작업을 하도록 하겠다.

- src/main/java/com/example/ex02/InsertActivity.java

package com.example.ex02;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class InsertActivity extends AppCompatActivity {

    FloatingActionButton insert;
    TextView wdate;
    EditText subject, content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("일기쓰기");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        insert = findViewById(R.id.insert);

        wdate = findViewById(R.id.wdate);
        subject = findViewById(R.id.subject);
        content = findViewById(R.id.content);

        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String strDate = wdate.getText().toString();
                String strSubject = subject.getText().toString();
                String strContent = content.getText().toString();
                if(strSubject.length()==0){
                    Toast.makeText(InsertActivity.this, "제목을 입력하세요.",Toast.LENGTH_SHORT).show();
                }else if(strContent.length()==0){
                    Toast.makeText(InsertActivity.this, "내용을 입력하세요.",Toast.LENGTH_SHORT).show();
                }else{
                    AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                    box.setMessage("내용을 저장하시겠습니까?");
                    box.setNegativeButton("아니오", null);
                    box.setPositiveButton("예",null);
                    box.show();
                }
            }
        });
    }
}

 

확인

 

- DB를 오픈하겠다.

package com.example.ex02;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class InsertActivity extends AppCompatActivity {

.....

    // DB 오픈을 위한 변수 선언
    DiaryDB diaryDB;
    SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        // DB 오픈
        diaryDB = new DiaryDB(this);
        // db = 다이어리 정보 put
        db = diaryDB.getWritableDatabase();

.....

        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String strDate = wdate.getText().toString();
                final String strSubject = subject.getText().toString();
                final String strContent = content.getText().toString();
                if(strSubject.length()==0){
                    Toast.makeText(InsertActivity.this, "제목을 입력하세요.",Toast.LENGTH_SHORT).show();
                }else if(strContent.length()==0){
                    Toast.makeText(InsertActivity.this, "내용을 입력하세요.",Toast.LENGTH_SHORT).show();
                }else{
                    AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                    box.setMessage("내용을 저장하시겠습니까?");
                    box.setNegativeButton("아니오", null);
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String sql = "insert into diary(wdate, subject, content) values(";
                            sql +="'"+strDate+"',";
                            sql +="'"+strSubject+"',";
                            sql +="'"+strContent+"')";
                            db.execSQL(sql);
                            // 저장 후 확인 Toast
                            Toast.makeText(InsertActivity.this, "저장되었습니다.",Toast.LENGTH_SHORT).show();
                            // insert 후 액티비티 fin
                            finish();
                        }
                    });
                    box.show();
                }
            }
        });
    }
}

 

확인

 

- 데이터 입력 후 앱을 재실행 할 필요없이 데이터가 갱신되도록 하겠다.

- src/main/java/com/example/ex02/DiaryActivity.java

package com.example.ex02;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import org.w3c.dom.Text;

public class DiaryActivity extends AppCompatActivity {

    DiaryDB diary;
    SQLiteDatabase db;

    // db select한 정보를 커서에 넣는다.
    Cursor cursor;

    // 전역변수 생성
    ListView list;
    MyAdater adapter;
    FloatingActionButton add;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
.....
    }

    // CursorAdapter 이용해서 쉽게 데이터를 가지고와서 list에 넣을 수 있다.
    public class MyAdater extends CursorAdapter{
.....
    }

	// new
    @Override
    protected void onRestart() {
        cursor = db.rawQuery("select * from diary order by _id desc", null);
        adapter.changeCursor(cursor);
        super.onRestart();
    }
}

 

확인

 

- 뒤로가기 버튼이 작동하게 하겠다.

- src/main/java/com/example/ex02/InsertActivity.java

.....
    // 해당 액티비티에 뒤로가기 버튼이 작동되게 하겠다.
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

확인

 

 

- insert 시 오늘 날짜가 입력되도록 하겠다.

- src/main/java/com/example/ex02/InsertActivity.java

package com.example.ex02;

.....

public class InsertActivity extends AppCompatActivity {

    FloatingActionButton insert;
    ImageView calendar;
    TextView wdate;
    EditText subject, content;

    // DB 오픈을 위한 변수 선언
    DiaryDB diaryDB;
    SQLiteDatabase db;

    // 오늘 날짜 입력을 위한 변수
    int mYear, mMonth, mDay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        // 그레고리캘린더로 년월일 가지고 오기
        GregorianCalendar cal = new GregorianCalendar();
        mYear = cal.get(Calendar.YEAR);
        mMonth = cal.get(Calendar.MONTH);
        mDay = cal.get(Calendar.DAY_OF_MONTH);

        // DB 오픈
        diaryDB = new DiaryDB(this);
        // db = 다이어리 정보 put
        db = diaryDB.getWritableDatabase();

        getSupportActionBar().setTitle("일기쓰기");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        insert = findViewById(R.id.insert);

        wdate = findViewById(R.id.wdate);
        //                          4자리/2자리/2자리, 순서대로
        wdate.setText(String.format("%04d/%02d/%02d",mYear,mMonth+1,mDay));
        subject = findViewById(R.id.subject);
        content = findViewById(R.id.content);

.....

        calendar = findViewById(R.id.calender);
        calendar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatePickerDialog(InsertActivity.this, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int dayOfMonth) {
                        wdate.setText(String.format("%04d/%02d/%02d",year,month+1,dayOfMonth));
                    }
                }, mYear,mMonth,mDay).show();
            }
        });
    }

.....
}

 

확인

 

 

- 다이어리 아이템을 클릭하여 정보를 읽는(Read) 작업을 하도록 하겠다.

- src/main/java/com/example/ex02/ReadActivity.java

package com.example.ex02;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MenuItem;

public class ReadActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read);

        getSupportActionBar().setTitle("일정정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

- src/main/java/com/example/ex02/DiaryActivity.java

.....
        // adapter 생성
        adapter = new MyAdater(this,cursor);
        list.setAdapter(adapter);
		//new
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(DiaryActivity.this, ReadActivity.class);
                //System.out.println("............"+cursor.getInt(0));
                intent.putExtra("id", cursor.getInt(0));
                startActivity(intent);
            }
        });
.....

 

- src/main/java/com/example/ex02/ReadActivity.java

package com.example.ex02;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;

public class ReadActivity extends AppCompatActivity {

    int id;
    TextView wdate;
    EditText subject, content;

    DiaryDB diaryDB;
    SQLiteDatabase db;
    Cursor cursor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("일정정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        wdate = findViewById(R.id.wdate);
        subject = findViewById(R.id.subject);
        content = findViewById(R.id.content);

        Intent intent = getIntent();
        id = intent.getIntExtra("id",-1);

        diaryDB = new DiaryDB(this);
        db = diaryDB.getWritableDatabase();
        cursor = db.rawQuery("select * from diary where _id="+id,null);

        if(cursor.moveToNext()){
            wdate.setText(cursor.getString(1));
            subject.setText(cursor.getString(2));
            content.setText(cursor.getString(3));
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

확인

 

- 읽어온 정보를 수정하는 작업을 하도록 하겠다.

- src/main/java/com/example/ex02/ReadActivity.java

package com.example.ex02;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class ReadActivity extends AppCompatActivity {
    int id;
    DiaryDB diaryDB;
    SQLiteDatabase db;
    Cursor cursor;
    TextView wdate;
    EditText subject, content;
    FloatingActionButton update;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);

        getSupportActionBar().setTitle("일기정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent=getIntent();
        id = intent.getIntExtra("id", -1);

        wdate = findViewById(R.id.wdate);
        subject = findViewById(R.id.subject);
        content = findViewById(R.id.content);
        update = findViewById(R.id.insert);
        update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder box=new AlertDialog.Builder(ReadActivity.this);
                box.setMessage("수정하실래요?");
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String strDate=wdate.getText().toString();
                        String strSubject=subject.getText().toString();
                        String strContent=content.getText().toString();
                        String sql="update diary set ";
                        sql += "wdate='" + strDate + "',";
                        sql += "subject='" + strSubject + "',";
                        sql += "content='" + strContent + "' ";
                        sql += "where _id=" + id;
                        db.execSQL(sql);
                        Toast.makeText(ReadActivity.this, "수정완료!", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                });
                box.setNegativeButton("아니오", null);
                box.show();
            }
        });



        diaryDB=new DiaryDB(this);
        db=diaryDB.getWritableDatabase();
        cursor = db.rawQuery("select * from diary where _id=" + id, null);

        if(cursor.moveToNext()) {
            wdate.setText(cursor.getString(1));
            subject.setText(cursor.getString(2));
            content.setText(cursor.getString(3));
        }
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

확인

 

 

- 삭제하도록 하겠다.

- src/main/res/(new)menu/(new)menu_read.xml

확인

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/remove"
        android:title="삭제"
        android:icon="@drawable/ic_remove"
        app:showAsAction="always"/>
</menu>

 

- src/main/java/com/example/ex02/ReadActivity.java

.....
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
            case R.id.remove:
                AlertDialog.Builder box = new AlertDialog.Builder(this);
                box.setMessage("삭제하시겠습니까?");
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String sql = "delete from diary where _id="+id;
                        db.execSQL(sql);
                        Toast.makeText(ReadActivity.this,"삭제되었습니다.",Toast.LENGTH_SHORT).show();
                        finish();
                    }
                });
                box.setNegativeButton("아니오",null);
                box.show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_read,menu);
        return super.onCreateOptionsMenu(menu);
    }
}

 

확인