마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

db내용을 업데이트 후 다른 클래스에서 리스트뷰로 조회하는 방법

0 추천
package com.example.finaltest2021;

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

public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "mycontacts.db";
    private static final int DATABASE_VERSION = 2;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE contacts (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, tel TEXT);");
        for (int i = 0; i < 10; i++) {
            db.execSQL("INSERT INTO contacts VALUES (null, " + "'김철수 "+ i + "'" + ", '010-1234-100" + i + "');");
        }
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS data");
        onCreate(db);
    }
}
db설정 했습니다.
 
package com.example.finaltest2021;

import androidx.annotation.Nullable;
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.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends AppCompatActivity {
    DBHelper helper;
    SQLiteDatabase db;

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

        helper = new DBHelper(this);
        db = helper.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM contacts", null);
        startManagingCursor(cursor);
        String[] from = {"name", "tel"};
        int[] to = {android.R.id.text1, android.R.id.text2};
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
                cursor, from, to);
        ListView list = findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getApplicationContext(), ModifyActivity.class);
                startActivity(intent);
            }
        });

    }
}
mainactivity에서 db설정한 것을 list뷰로 봅니다.
이름, 전화번호를 수정,업데이트 하는것은 다른 class에서 해야해서 intent를 사용해 화면 전환을 했습니다.
 
 
 
package com.example.finaltest2021;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class ModifyActivity extends AppCompatActivity {
    DBHelper helper;
    SQLiteDatabase db;
    EditText edit_name, edit_tel;

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

        helper = new DBHelper(this);
        try {
            db = helper.getWritableDatabase();
        } catch (SQLiteException ex) {
            db = helper.getReadableDatabase();
        }

        edit_name = findViewById(R.id.edtName);
        edit_tel = findViewById(R.id.edtTel);
    }
    public void Update(View view){
        String name = edit_name.getText().toString();
        String tel = edit_tel.getText().toString();
        db.execSQL("UPDATE contacts SET (NULL,'" + name + "', '" + tel + "');" );
        edit_name.setText("");
        edit_tel.setText("");
    }
}
화면 전환하여 수정 버튼을 만들었습니다. onclick 설정은 update로 했습니다.
1. update 구문이 맞나요?
2. 만약 맞다면 업데이트 후 다시 MainActivity로 돌아가서 list뷰에 반영 될 수 있게 하려면 어떤 방법을 써야하나요?
hongsom (120 포인트) 님이 2021년 6월 11일 질문
update는 field = value 형태로 값이 들어가야 할 텐데요. 그리고 where 절에 조건을 넣으셔야 하구요. 그리고 업데이트 되고 나면 MainActivity에서 다시 select를 하셔야 겠죠. 라이프사이클이벤트나 getActivityResult를 통해서 처리를 하셔야 할 듯 해요. 아니면  observer 패턴으로 db의 변경여부를 체크할 수 있다면 훨씬 더 나을 듯 합니다.

개인적인 의견인데, 가능하시다면 그냥 RoomDB를 사용하세요. 님이 작성하시는 코드는 사실 코드량만 늘어나고 불필요하게 작성해야 하는 코드들이예요.
Activity와 db 관련 코드가 섞여있는 건 전형적인 권장하지 않는 코드입니다. 분리하세요. 그리고 db 작업은 백그라운드에서 처리하세요.

그리고  아래라인은 전혀 이해가 가지 않네요.
helper = new DBHelper(this);
        try {
            db = helper.getWritableDatabase();
        } catch (SQLiteException ex) {
            db = helper.getReadableDatabase();
        }

에러가 나면 읽기 전용으로 열게 되어 있는데, 이럴 경우는  insert, update, delete 같은 동작에서 에러가 날 텐데 해당 부분에 예외 처리를 하셔야 하고, 사용자에게 database 로딩에 문제가 생겨 기능제한이 있을 거라고 안내를 하거나, analytics등을 통해 리포트를 전송하고 적절한 메세지를 띄운 후에 앱을 종료하시는게 좋을 것 같은데요.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...