SQLite
앱을 만들면서 데이터를 간단하게 저장하고 싶을 때는 SharedPreferences를 사용할 수 있습니다. 하지만 많은 양의 데이터를 체계적으로 관리하려면 데이터 베이스를 사용해야 합니다.
SQLite는 안드로이드에서 임베디드 데이터베이스로 개발된 경량급 관계형 데이터베이스입니다.
일반적인 데이터베이스 활용 순서는 다음과 같습니다.
데이터베이스 만들기
테이블 만들기
레코드 추가하기
데이터 조회하기
오늘은 데이터베이스와 테이블을 생성하고 레코드를 추하한 후 리사이클러뷰에서 데이터를 조회하는 예제를 만들어보겠습니다.
우선 데이터베이스를 만들어야 하는데요.
데이터베이스를 만드는 가장 간단한 방법은 Context클래스에 정의된 openOrCreateDatabase()메서드를 사용하는 것 입니다.
데이터 베이스 생성 코드먼저 확인해보겠습니다.
우선
SQLiteDatabase객체를 참조하여 database변수를 선언합니다.
private void createDatabase(String name){
database = openOrCreateDatabase(name,MODE_PRIVATE,null);
}
createDatabase 메서드를 사용하여 데이터베이스를 만들어 줍니다.
다음으로 테이블을 생성하겠습니다.
private void createTable(String name){
database.execSQL("create table if not exists " + name + "(_id integer PRIMARY KEY autoincrement, name text, age text, mobile text)");
}
createTable 메서드를 사용하여 테이블을 생성해줍니다.
마지막으로 레코드를 추가하는 코드입니다.
private void insertRecord(String name, String age, String mobile) {
Toast.makeText(this,"insertRecord 호출됨.",Toast.LENGTH_SHORT).show();
if(database == null){
Toast.makeText(this,"데이터베이스를 먼저 생성하세요.",Toast.LENGTH_SHORT).show();
return;
}
if(tableName == null){
Toast.makeText(this,"테이블을 먼저 생성하세요.",Toast.LENGTH_SHORT).show();
return;
}
database.execSQL("insert into " + tableName
+" (name, age, mobile)"
+" values"
+" ('name', 'age', 'mobile')");
Toast.makeText(this,"레코드 추가함", Toast.LENGTH_SHORT).show();
}
이제 차례대로 데이터베이스 만들기와 테이블 만들기를 진행해 주겠습니다.
그후 레코드를 추가하기위해 이름과 나이, 전화번호를 입력한 후 레코드 추가하기 버튼을 클릭해줍니다.
레코드를 추가해준후 조회하기 버튼을 클릭하면, 모바일데이터 베이스에 저장됐던 데이터들을 리사이클러뷰로 불러오는 모습을 확인할수 있습니다.
전체 코드입니다.
MainActivity.java
package org.techtown.testapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
EditText editText;
EditText editText2;
TextView textView;
SQLiteDatabase database;
String databaseName;
String tableName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
editText2 = findViewById(R.id.editText2);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
databaseName = editText.getText().toString();
createDatabase(databaseName);
}
});
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tableName = editText2.getText().toString();
createTable(tableName);
}
});
}
private void createDatabase(String name){
Toast.makeText(this,"createDatabase 호출됨.",Toast.LENGTH_SHORT).show();
database = openOrCreateDatabase(name,MODE_PRIVATE,null);// 데이터베이스를 만들기 위한 메서드 실행하기
Toast.makeText(this,"데이터베이스 생성함: " + name,Toast.LENGTH_SHORT).show();
}
private void createTable(String name) {
Toast.makeText(this,"createTable 호출됨.",Toast.LENGTH_SHORT).show();
if(database == null){
Toast.makeText(this,"데이터베이스를 먼저 생성하세요.",Toast.LENGTH_SHORT).show();
return;
}
database.execSQL("create table if not exists " + name + "(_id integer PRIMARY KEY autoincrement, name text, age text, mobile text)");
Toast.makeText(this,"테이블 생성함: " + name,Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getApplicationContext(),MainActivity2.class);
intent.putExtra("db",databaseName);
intent.putExtra("tb",tableName);
startActivity(intent);
}
private void insertRecord() {
Toast.makeText(this,"insertRecord 호출됨.",Toast.LENGTH_SHORT).show();
if(database == null){
Toast.makeText(this,"데이터베이스를 먼저 생성하세요.",Toast.LENGTH_SHORT).show();
return;
}
if(tableName == null){
Toast.makeText(this,"테이블을 먼저 생성하세요.",Toast.LENGTH_SHORT).show();
return;
}
database.execSQL("insert into " + tableName
+" (name, age, mobile)"
+" values"
+" ('John', 20, '010-1000-1000')");
Toast.makeText(this,"레코드 추가함", Toast.LENGTH_SHORT).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/editText"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="데이터베이스 만들기"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/editText2"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="테이블 만들기"/>
</LinearLayout>
</LinearLayout>
MainActivity2.java
package org.techtown.testapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity2 extends AppCompatActivity {
SQLiteDatabase database;
String TAG = "MainActivity2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent intent = getIntent();
String db = intent.getStringExtra("db");
String tb = intent.getStringExtra("tb");
TextView textView_db = findViewById(R.id.textView_db);
TextView textView_tb = findViewById(R.id.textView_tb);
textView_db.setText("데이터베이스: "+db);
textView_tb.setText("테이블: "+tb);
EditText et_name = findViewById(R.id.et_name);
EditText et_age = findViewById(R.id.et_age);
EditText et_pn = findViewById(R.id.et_pn);
Button btn_add = findViewById(R.id.btn_add);
Button btn_show = findViewById(R.id.btn_show);
//레코드 추가 버튼
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = et_name.getText().toString();
String age = et_age.getText().toString();
String mobile = et_pn.getText().toString();
database = openOrCreateDatabase(db,MODE_PRIVATE,null);// 데이터베이스를 만들기 위한 메서드 실행하기
//레코드에 추가가
database.execSQL("insert into " + tb
+" (name, age, mobile)"
+" values"
+" ('"+name+"', '"+age+"','"+mobile+"')");
et_name.setText("");
et_age.setText("");
et_pn.setText("");
}
});
//조회버튼
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(getApplicationContext(),MainActivity3.class);
intent1.putExtra("db",db);
intent1.putExtra("tb",tb);
startActivity(intent1);
}
});
}
}
activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2"
android:orientation="vertical">
<TextView
android:id="@+id/textView_db"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="db"/>
<TextView
android:id="@+id/textView_tb"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="tb"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이름"/>
<EditText
android:id="@+id/et_age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="나이"/>
<EditText
android:id="@+id/et_pn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="전화번호"/>
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="레코드 추가하기"/>
<Button
android:id="@+id/btn_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="조회하기"/>
</LinearLayout>
MainActivity3.java
package org.techtown.testapplication;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.MenuItem;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity3 extends AppCompatActivity {
String TAG = "MainActivity3";
ArrayList<DataModel> dataModels = new ArrayList<>();
Adapter adapter;
SQLiteDatabase database;
String tb,db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
Intent intent = getIntent();
db = intent.getStringExtra("db");
tb = intent.getStringExtra("tb");
database = openOrCreateDatabase(db,MODE_PRIVATE,null);// 데이터베이스를 만들기 위한 메서드 실행하기
adapter = new Adapter(getApplicationContext(),dataModels);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,false));
Cursor cursor = database.rawQuery("select name, age, mobile from "+tb,null);
int recordCount = cursor.getCount();
Log.d(TAG,"recordCount: " + recordCount);
for (int i = 0; i < recordCount; i++){
cursor.moveToNext();
String name = cursor.getString(0);
String age = cursor.getString(1);
String mobile = cursor.getString(2);
Log.d(TAG,"name: " + name);
dataModels.add(new DataModel(name,mobile,age));
//리사이클러뷰에 추가
}
cursor.close();
Log.d(TAG,"datamodels: " + dataModels.toString());
adapter.notifyDataSetChanged();
}
}
activity_main3.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity3">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
Adapter.java
package org.techtown.testapplication;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import androidx.recyclerview.widget.RecyclerView;
public class Adapter extends RecyclerView.Adapter {
/*
어댑터의 동작원리 및 순서
1.(getItemCount) 데이터 개수를 세어 어댑터가 만들어야 할 총 아이템 개수를 얻는다.
2.(getItemViewType)[생략가능] 현재 itemview의 viewtype을 판단한다
3.(onCreateViewHolder)viewtype에 맞는 뷰 홀더를 생성하여 onBindViewHolder에 전달한다.
4.(onBindViewHolder)뷰홀더와 position을 받아 postion에 맞는 데이터를 뷰홀더의 뷰들에 바인딩한다.
*/
String TAG = "RecyclerViewAdapter";
//리사이클러뷰에 넣을 데이터 리스트
ArrayList<DataModel> dataModels;
Context context;
//생성자를 통하여 데이터 리스트 context를 받음
public Adapter(Context context, ArrayList<DataModel> dataModels){
this.dataModels = dataModels;
this.context = context;
}
@Override
public int getItemCount() {
//데이터 리스트의 크기를 전달해주어야 함
return dataModels.size();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d(TAG,"onCreateViewHolder");
//자신이 만든 itemview를 inflate한 다음 뷰홀더 생성
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_view,parent,false);
MyViewHolder viewHolder = new MyViewHolder(view);
//생선된 뷰홀더를 리턴하여 onBindViewHolder에 전달한다.
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Log.d(TAG,"onBindViewHolder");
MyViewHolder myViewHolder = (MyViewHolder)holder;
myViewHolder.tv_name.setText("이름: "+dataModels.get(position).getName());
myViewHolder.tv_age.setText("나이: "+dataModels.get(position).getAge());
myViewHolder.tv_mobile.setText("전화번호: " + dataModels.get(position).getMobile());
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv_name,tv_age,tv_mobile;
ImageView imageView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_name);
tv_age = itemView.findViewById(R.id.tv_age);
tv_mobile = itemView.findViewById(R.id.tv_mobile);
}
}
}
DataModel.java
package org.techtown.testapplication;
public class DataModel {
String name,mobile,age;
public DataModel(String name, String mobile, String age) {
this.name = name;
this.mobile = mobile;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20sp"/>
<TextView
android:id="@+id/tv_mobile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20sp"/>
</LinearLayout>
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] 안드로이드 Library만들기 (0) | 2021.11.30 |
---|---|
[Java][Android] 터치 제스처 감지 (Gesture Detector) (0) | 2021.11.29 |
[Java][Android] SnackBar 만들기 (0) | 2021.11.22 |
[Java][Android] ScrollView 최상ㆍ하단 감지 (0) | 2021.11.21 |
[JAVA][Android] 리사이클러뷰 접기, 펴기 (0) | 2021.11.18 |