- 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'
}
- 이전에 사용했던 이미지를 복사해서 아래와 같이 넣는다.
- 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>
'ICIA 수업일지' 카테고리의 다른 글
2021.09.29 수업일지(안드로이드 개발 기초, Kakao API, Google API) (0) | 2021.09.29 |
---|---|
2021.09.28 수업일지(안드로이드 기초, SQLite) (0) | 2021.09.28 |
2021.09.24 수업일지(안드로이드 개발 기초, SQLite) (0) | 2021.09.24 |
2021.09.23 수업일지(안드로이드 개발 기초, Activity, View) (0) | 2021.09.23 |
2021.09.17 수업일지(React.js을 이용한 블로그 개설) (0) | 2021.09.17 |