본문 바로가기
ICIA 수업일지

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

by 주성씨 2021. 9. 27.

- SQLite DB : 안드로이드에서 기본적으로 제공하는 로컬(핸드폰) DB

 

- 프로젝트 생성

 

생성완료

 

- 프로젝트 app 실행을 위해 아래와 같이 수정

- build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30 // 수정
    buildToolsVersion "30.0.0" // 수정

    defaultConfig {
        applicationId "com.example.ex03"
        minSdkVersion 26 // 수정
        targetSdkVersion 30 // 수정
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

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'

}

 

확인

 

- 이전에 사용했던 이미지를 복사해서 아래와 같이 넣는다.

drawable-v24.zip
0.23MB
확인

 

- SQLite DB 연결을 위한 java class를 생성한다.

- 생성하고 method와 instructor을 만든다.

확인

 

 

- src/main/java/com/example/ex03/AddressDB.java

package com.example.ex03;

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

import androidx.annotation.Nullable;

public class AddressDB extends SQLiteOpenHelper {
    public AddressDB(@Nullable Context context) {
        super(context, "address.db",null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table address(_id integer primary key autoincrement, photo text, name text, tel text, juso text)";
        db.execSQL(sql);
        sql = "insert into address(photo,name,tel,juso) values('R.drawable.img01', '송중기', '010-0101-0101', '서울시 강남구 신사동')";
        db.execSQL(sql);
        sql = "insert into address(photo,name,tel,juso) values('R.drawable.img02', '박지성', '010-0202-0202', '서울시 관악구 신립동')";
        db.execSQL(sql);
        sql = "insert into address(photo,name,tel,juso) values('R.drawable.img03', '이지성', '010-0303-0303', '서울시 은평구 불광동')";
        db.execSQL(sql);
        sql = "insert into address(photo,name,tel,juso) values('R.drawable.img04', '조인성', '010-0404-0404', '서울시 용산구 이태원동')";
        db.execSQL(sql);
        sql = "insert into address(photo,name,tel,juso) values('R.drawable.img05', '현빈', '010-0505-0505', '서울시 노원구 월계동')";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

 

- src/main/java/com/example/ex03/AddressDB.java

- Device File Explorer/data/data/com.example.ex03/databases/address.db 에서 db가 생성된 것을 확인한다.

package com.example.ex03;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    AddressDB addressDB;
    SQLiteDatabase db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addressDB = new AddressDB(this);
        db = addressDB.getWritableDatabase();
    }
}

확인

 

- 이제 Layout을 꾸며보자.

- src/main/res/layout/activity_main.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=".MainActivity">

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

</RelativeLayout>

 

- 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="#FFD97A"
    android:padding="10sp">
    <ImageView
        android:id="@+id/photo"
        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="25sp"
        android:layout_toRightOf="@id/photo"/>
    <TextView
        android:id="@+id/tel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="010-0000-0000"
        android:textSize="15sp"
        android:layout_toRightOf="@id/photo"
        android:layout_below="@id/name"/>
    <TextView
        android:id="@+id/juso"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="인천시 중구 신포동"
        android:textSize="15sp"
        android:layout_toRightOf="@id/photo"
        android:layout_below="@id/tel"/>
</RelativeLayout>

 

- 이제 DB에 데이터를 item.xml에 찍어보겠다.

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

package com.example.ex03;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    AddressDB addressDB;
    SQLiteDatabase db;
    Cursor cursor;
    ListView list;
    MyAdapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addressDB = new AddressDB(this);
        db = addressDB.getWritableDatabase();

        String sql = "select * from address order by _id desc";
        cursor = db.rawQuery(sql,null);

        list = findViewById(R.id.list);

        myAdapter = new MyAdapter(this, cursor);
        list.setAdapter(myAdapter);
    }

    public class MyAdapter extends CursorAdapter {
        public MyAdapter(Context context, Cursor c) {
            super(context, c);
        }

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

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ImageView photo = view.findViewById(R.id.photo);
            photo.setImageResource(R.drawable.img01);
            TextView name = view.findViewById(R.id.name);
            name.setText(cursor.getString(2));
            TextView tel = view.findViewById(R.id.tel);
            tel.setText(cursor.getString(3));
            TextView juso = view.findViewById(R.id.juso);
            juso.setText(cursor.getString(4));
        }
    }
}

 

- 이미지를 원형으로 출력해보겠다.

build.gradle

dependencies {
.....
    implementation 'de.hdodenhof:circleimageview:3.1.0' // 추가
}

 

- src/main/res/layout/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="#FFD97A"
    android:padding="10sp">
    <de.hdodenhof.circleimageview.CircleImageView // 수정
        android:id="@+id/photo"
        android:layout_width="70sp"
        android:layout_height="70sp"
        android:src="@mipmap/ic_launcher_round"
        android:layout_marginRight="20sp"/>
....
</RelativeLayout>

 

확인

 

- 주소록 타이틀 변경 및 이미지 추가

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

package com.example.ex03;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    AddressDB addressDB;
    SQLiteDatabase db;
    Cursor cursor;
    ListView list;
    MyAdapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 타이틀 변경 및 이미지 추가
        getSupportActionBar().setTitle("주소록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // 드로우에이블에서 벡터 에셋으로 이미지 추가
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_address_image);
        
.....

 

확인

 

- 주소를 정렬하는 menu를 만들어주도록 하겠다.

- 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">
    <item
    android:id="@+id/id"
    android:title="최신순정렬"/>
    <item
        android:id="@+id/name"
        android:title="이름순정렬"/>
    <item
        android:id="@+id/tel"
        android:title="전화번호순순정렬"/>
    <item
        android:id="@+id/juso"
        android:title="주소순정렬"/>
</menu>

 

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

.....

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

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        String sql = "";
        switch (item.getItemId()){
            case R.id.id:
                sql = "select * from address order by _id";
                break;
            case R.id.name:
                sql = "select * from address order by name";
                break;
            case R.id.tel:
                sql = "select * from address order by tel";
                break;
            case R.id.juso:
                sql = "select * from address order by juso";
                break;
        }
        cursor = db.rawQuery(sql, null);
        myAdapter.changeCursor(cursor);

        return super.onOptionsItemSelected(item);
    }
}

 

확인

 

- 이제 등록하는 작업을 해보도록 하겠다. (Insert)

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

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

위치

 

- build.gradle

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

 추가

 

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

.....
       
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_add"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="30sp"
        android:layout_marginBottom="30sp"
        android:backgroundTint="#FFD400"/>
</RelativeLayout>

 

- 추가를 위한 액티비티 생성, 뒤로가길로 홈으로

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

package com.example.ex03;

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

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

public class InsertActivity extends AppCompatActivity {

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

        getSupportActionBar().setTitle("주소등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

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

 

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

package com.example.ex03;

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

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

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

public class MainActivity extends AppCompatActivity {
    AddressDB addressDB;
    SQLiteDatabase db;
    Cursor cursor;
    ListView list;
    MyAdapter myAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 타이틀 변경
        getSupportActionBar().setTitle("주소록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_address_image);

        addressDB = new AddressDB(this);
        db = addressDB.getWritableDatabase();

        String sql = "select * from address order by _id desc";
        cursor = db.rawQuery(sql,null);

        list = findViewById(R.id.list);

        myAdapter = new MyAdapter(this, cursor);
        list.setAdapter(myAdapter);

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

 

확인

 

 

- 이제 insert 액티비티를 꾸며주도록 하겠다.

- 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:layout_margin="30sp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/photo"
        android:layout_width="250sp"
        android:layout_height="250sp"
        android:src="@drawable/ic_baseline_person_24"
        android:layout_centerHorizontal="true"
        />
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름"
        android:layout_below="@id/photo"
        android:layout_marginBottom="20sp"/>
    <EditText
        android:id="@+id/tel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="전화번호"
        android:layout_below="@id/name"
        android:layout_marginBottom="20sp"/>
    <EditText
        android:id="@+id/juso"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="두소"
        android:layout_below="@id/tel"
        android:layout_marginBottom="20sp"/>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_add"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="30sp"
        android:layout_marginBottom="30sp"
        android:backgroundTint="#FFD400"/>
</RelativeLayout>

 

확인

 

- 이제 add 버튼으로 저장하는 작업을 하도록 하겠다.

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

package com.example.ex03;

import androidx.annotation.NonNull;
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.provider.Telephony;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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

public class InsertActivity extends AppCompatActivity {

    EditText name,tel,juso;
    AddressDB addressDB;
    SQLiteDatabase db;

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

        addressDB = new AddressDB(this);
        db= addressDB.getWritableDatabase();

        getSupportActionBar().setTitle("주소등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // 아이디 읽어오기
        name = findViewById(R.id.name);
        tel = findViewById(R.id.tel);
        juso = findViewById(R.id.juso);

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String strName = name.getText().toString();
                final String strTel = tel.getText().toString();
                final String strJuso = juso.getText().toString();
                if(strName.length()==0 || strTel.length() == 0 || strJuso.length() == 0){
                    Toast.makeText(InsertActivity.this, "내용을 입력하세요.", Toast.LENGTH_SHORT).show();
                }else{
                    AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                    box.setMessage("저장하시겠습니까?");
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String sql = "insert into address(name, tel, juso) values(";
                            sql += "'"+strName+"', ";
                            sql += "'"+strTel+"', ";
                            sql += "'"+strJuso+"')";
                            db.execSQL(sql);
                            finish();
                        }
                    });
                    box.setNegativeButton("아니오",null);
                    box.show();
                }
            }
        });
    }

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

 

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

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

 

확인

 

- read 액티비티를 생성하겠다.

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

.....
        list = findViewById(R.id.list);

        // list 불러온 후 id를 intent에 담아서 read액티비티에 넘긴다.
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, ReadActivity.class);
                intent.putExtra("id",cursor.getInt(0));
                startActivity(intent);
            }
        });
.....

 

- src/main/java/com/example/ex03/(new)ReadActivity.java

package com.example.ex03;

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;

public class ReadActivity extends AppCompatActivity {

    AddressDB addressDB;
    SQLiteDatabase db;
    Cursor cursor;
    EditText name, tel, juso;

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

        getSupportActionBar().setTitle("주소정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        addressDB = new AddressDB(this);
        db = addressDB.getWritableDatabase();

        Intent intent = getIntent();
        int id = intent.getIntExtra("id",0);
        cursor = db.rawQuery("select * from address where _id="+id,null);

        name = findViewById(R.id.name);
        tel = findViewById(R.id.tel);
        juso = findViewById(R.id.juso);

        if(cursor.moveToNext()){
            name.setText(cursor.getString(2));
            tel.setText(cursor.getString(3));
            juso.setText(cursor.getString(4));
        }
    }

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

 

확인

 

 

- 이미지 경로

- 디바이스 파일 익스프롤러/storage/emulated/0/Pictures

 

- 주소정보에서 이미지를 클릭하면 포토앱이 실행되도록 하겠다.

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

package com.example.ex03;

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

import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Telephony;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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

import de.hdodenhof.circleimageview.CircleImageView;

public class InsertActivity extends AppCompatActivity {

    EditText name,tel,juso;
    AddressDB addressDB;
    SQLiteDatabase db;
    CircleImageView photo;

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

        addressDB = new AddressDB(this);
        db= addressDB.getWritableDatabase();

        getSupportActionBar().setTitle("주소등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // 아이디 읽어오기
        name = findViewById(R.id.name);
        tel = findViewById(R.id.tel);
        juso = findViewById(R.id.juso);

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String strName = name.getText().toString();
                final String strTel = tel.getText().toString();
                final String strJuso = juso.getText().toString();
                if(strName.length()==0 || strTel.length() == 0 || strJuso.length() == 0){
                    Toast.makeText(InsertActivity.this, "내용을 입력하세요.", Toast.LENGTH_SHORT).show();
                }else{
                    AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                    box.setMessage("저장하시겠습니까?");
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String sql = "insert into address(name, tel, juso) values(";
                            sql += "'"+strName+"', ";
                            sql += "'"+strTel+"', ";
                            sql += "'"+strJuso+"')";
                            db.execSQL(sql);
                            finish();
                        }
                    });
                    box.setNegativeButton("아니오",null);
                    box.show();
                }
            }
        });
		// new
        photo = findViewById(R.id.photo);
        photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 0);
            }
        });
    }
	// new
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0){
            photo.setImageURI(data.getData());
        }
    }

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

 

확인

 

- 이제 이미지를 SQLite에 저장하도록 하겠다.

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

package com.example.ex03;

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

import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Telephony;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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

import de.hdodenhof.circleimageview.CircleImageView;

public class InsertActivity extends AppCompatActivity {

    EditText name,tel,juso;
    AddressDB addressDB;
    SQLiteDatabase db;
    // new
    CircleImageView photo;
    String strPhoto;

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

        addressDB = new AddressDB(this);
        db= addressDB.getWritableDatabase();

        getSupportActionBar().setTitle("주소등록");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        // 아이디 읽어오기
        name = findViewById(R.id.name);
        tel = findViewById(R.id.tel);
        juso = findViewById(R.id.juso);

        FloatingActionButton add = findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String strName = name.getText().toString();
                final String strTel = tel.getText().toString();
                final String strJuso = juso.getText().toString();
                if(strName.length()==0 || strTel.length() == 0 || strJuso.length() == 0){
                    Toast.makeText(InsertActivity.this, "내용을 입력하세요.", Toast.LENGTH_SHORT).show();
                }else{
                    AlertDialog.Builder box = new AlertDialog.Builder(InsertActivity.this);
                    box.setMessage("저장하시겠습니까?");
                    box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            String sql = "insert into address(name, tel, juso,photo) values(";
                            sql += "'"+strName+"', ";
                            sql += "'"+strTel+"', ";
                            sql += "'"+strJuso+"', ";
                            sql += "'"+strPhoto+"')"; // new
                            db.execSQL(sql);
                            finish();
                        }
                    });
                    box.setNegativeButton("아니오",null);
                    box.show();
                }
            }
        });
.....

 

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

.....
    public class MyAdapter extends CursorAdapter {
        public MyAdapter(Context context, Cursor c) {
            super(context, c);
        }

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

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
        	// new
            ImageView photo = view.findViewById(R.id.photo);
            String strPhoto = cursor.getString(1);
            if(cursor.getString(1).equals("")){
                photo.setImageResource(R.drawable.ic_baseline_person_24);
            }else{
                photo.setImageURI(Uri.parse(strPhoto));
            }
            TextView name = view.findViewById(R.id.name);
            name.setText(cursor.getString(2));
            TextView tel = view.findViewById(R.id.tel);
            tel.setText(cursor.getString(3));
            TextView juso = view.findViewById(R.id.juso);
            juso.setText(cursor.getString(4));
        }
    }
.....

 

 

- 주소정보란에서 데이터를 수정하도록 하겠다. (update)

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

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

        edit = findViewById(R.id.add);
        edit.setImageResource(R.drawable.ic_add);

        getSupportActionBar().setTitle("주소정보");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        addressDB = new AddressDB(this);
        db = addressDB.getWritableDatabase();

        Intent intent = getIntent();
        id = intent.getIntExtra("id",0);
        cursor = db.rawQuery("select * from address where _id="+id,null);

        name = findViewById(R.id.name);
        tel = findViewById(R.id.tel);
        juso = findViewById(R.id.juso);

        if(cursor.moveToNext()){
            name.setText(cursor.getString(2));
            tel.setText(cursor.getString(3));
            juso.setText(cursor.getString(4));
        }
        // 수정버튼을 클릭한 경우
        edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder box = new AlertDialog.Builder(ReadActivity.this);
                box.setMessage("수정하실래요?");
                box.setNegativeButton("아니요",null);
                box.setPositiveButton("예", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String strName = name.getText().toString();
                        String strTel = tel.getText().toString();
                        String strJuso = juso.getText().toString();
                        String sql = "update address set name ='"+strName+"',";
                        sql += "tel='"+strTel+"',";
                        sql += "juso='"+strJuso+"'";
                        sql += "where _id="+id;
                        db.execSQL(sql);
                        finish();
                    }
                });
                box.show();
            }
        });

    }
.....

 

확인

 

- 삭제를 하도록 하겠다. (delete)

- src/main/res/menu/(new)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/delete"
        android:title="삭제"
        android:icon="@drawable/ic_baseline_delete_24"
        app:showAsAction="always"/>
</menu>

 

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

.....
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                finish();
                break;
            case R.id.delete:
                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 address where _id="+id;
                        db.execSQL(sql);
                        finish();
                    }
                });
                box.setNegativeButton("아니오",null);
                box.show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

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

 

확인

 

- 검색 해보도록 하겠다. (search)

- src/main/res/menu/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/id"
    android:title="최신순정렬"/>
    <item
        android:id="@+id/name"
        android:title="이름순정렬"/>
    <item
        android:id="@+id/tel"
        android:title="전화번호순순정렬"/>
    <item
        android:id="@+id/juso"
        android:title="주소순정렬"/>
    <item
        android:id="@+id/search"
        android:title="검색"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.widget.SearchView"
        />
</menu>

 

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

.....
    @Override // new
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_read, menu);
        MenuItem search = menu.findItem(R.id.search);
        SearchView searchView = (SearchView)search.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                String query = "'%" + newText + "%'";
                cursor = db.rawQuery("select * from address where name like "+query, null);
                myAdapter.changeCursor(cursor);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        String sql = "select * from address order by _id desc"; // new
        switch (item.getItemId()){
            case R.id.id:
                sql = "select * from address order by _id";
                break;
            case R.id.name:
                sql = "select * from address order by name";
                break;
            case R.id.tel:
                sql = "select * from address order by tel";
                break;
            case R.id.juso:
                sql = "select * from address order by juso";
                break;
        }
        cursor = db.rawQuery(sql, null);
        myAdapter.changeCursor(cursor);

        return super.onOptionsItemSelected(item);
    }

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

 

확인

 

 

- 전화번호를 누르면 통화가 되도록 하겠다.

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

- 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:layout_margin="30sp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/photo"
        android:layout_width="250sp"
        android:layout_height="250sp"
        android:src="@drawable/ic_baseline_person_24"
        android:layout_centerHorizontal="true"
        />
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름"
        android:layout_below="@id/photo"
        android:layout_marginBottom="20sp"/>
    <EditText
        android:id="@+id/tel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="전화번호"
        android:layout_below="@id/name"
        android:layout_marginBottom="20sp"/>
    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_phone"
        android:layout_below="@id/name"
        android:layout_alignParentRight="true"
        app:civ_border_width="1sp"
        app:civ_border_color="#000000"/>
    <EditText
        android:id="@+id/juso"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="주소"
        android:layout_below="@id/tel"
        android:layout_marginBottom="20sp"/>
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_add"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="30sp"
        android:layout_marginBottom="30sp"
        android:backgroundTint="#FFD400"/>
</RelativeLayout>

 

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

.....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
.....

        CircleImageView phone = findViewById(R.id.phone);
        phone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+tel.getText().toString()));
                startActivity(intent);
            }
        });

    }
.....

 

확인

 

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

package com.example.ex03;

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

import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Telephony;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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

import de.hdodenhof.circleimageview.CircleImageView;

public class InsertActivity extends AppCompatActivity {

    EditText name,tel,juso;
    AddressDB addressDB;
    SQLiteDatabase db;
    CircleImageView photo;
    String strPhoto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert);
		// new
        CircleImageView phone = findViewById(R.id.phone);
        phone.setVisibility(View.INVISIBLE);
        .....

 

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300sp"
    android:layout_height="match_parent"
    android:background="#3F51B5"
    android:id="@+id/drawerView"
    android:orientation="vertical"
    android:layout_gravity="start"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="홍길동님"
        android:textSize="30sp"
        android:textColor="#FFFFFF"
        android:layout_gravity="center"
        android:layout_marginTop="150sp"
        android:layout_marginBottom="20sp"/>
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="200sp"
        android:layout_height="wrap_content"
        android:src="@drawable/img01"
        android:layout_gravity="center"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="즐거운하루 보내세요."
        android:textSize="20sp"
        android:layout_gravity="center"
        android:layout_marginTop="20sp"
        android:textColor="#FFFFFF"
        />
</LinearLayout>

 

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

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
    android:background="#00BCD4"
    android:id="@+id/drawerLayout">
    <include layout="@layout/drawer_view"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <ListView
            android:id="@+id/list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_add"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="30sp"
            android:layout_marginBottom="30sp"
            android:backgroundTint="#FFD400"/>
    </RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>

 

확인

 

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

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
    android:background="#00BCD4"
    android:id="@+id/drawerLayout">
    <include layout="@layout/drawer_view"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <ListView
            android:id="@+id/list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_add"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="30sp"
            android:layout_marginBottom="30sp"
            android:backgroundTint="#FFD400"/>
    </RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>