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

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

- 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

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

- 이제 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

....

확인

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

- 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

- 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

.....

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

- 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

확인

- 이제 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

- 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

- 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

- 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

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

확인

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

from http://becomefullstackdev.tistory.com/97 by ccl(A) rewrite - 2021-09-27 17:27:19