관리 메뉴

웹개발자의 기지개

apk 앱설치시 앱자체에 저장된 DB로 바로 읽고 이용하기 (SQLite) - DB없으면 자동복사 해오기 본문

안드로이드

apk 앱설치시 앱자체에 저장된 DB로 바로 읽고 이용하기 (SQLite) - DB없으면 자동복사 해오기

http://portfolio.wonpaper.net 2020. 1. 8. 07:03

앱작업시 sqlite 와 같은 모바일기기내 자체 DB를 자유롭게 활용할 수 있는데, 

보통 SQLiteOpenHelper 클래스를 상속받아서 최초 앱가동시 onCreate() 에서 테이블 스키마와 데이터 내용 스크립트를 돌려서 간단히 자체 DB를 간단히 구축하여 DB 내용을 준비해 둔다.

 

그런데, 의문점이 생겼다. 이렇게 하지 말고 이미 DB 테이블과 데이터를 만들어놓은 DB 파일을 준비해두었다가, 바로 DB화하여 이용할 수 없을까 ?

 

구글링하고 나름 소스를 정리해 보았다.

 

전체적인 흐름을 간단히 얘기하면,

1. asstes 폴더를 생성해 놓는다. 앱설치시 자동 따라온다. 이안에 db파일을 넣어둔다.

2. SQLiteOpenHelper 클래스를 상속한 DB핼퍼클래스안에서, assets 안에서 그 db파일을 복사해온다.

 

assets 폴더를 생성해 본다.

assets 내에 muji_hyho.db 파일을 복사해둔다.

상기 도식화면과 같이 muji_hyho.db DB파일을 assets 내에 복사하면 

/main/assets/muji_hypo.db 경로를 가진다.

 

assets 내에서 다른 json 파일이나 다른 여타의 파일을 복사하여 활용할 수도 있는데 본 글에서는 이미 복사해둔 DB 활용이라 db 파일을 기준으로 한다.

 

그 다음에는 소스로 활용해 본다.

 

[ DataBaseHelper.java ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package wonpa.com.mujimakjihypothesistest.db;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class DataBaseHelper extends SQLiteOpenHelper {
    private final static String TAG = "DataBaseHelper"// Logcat에 출력할 태그이름
    // database 의 파일 경로
    private static String DB_PATH = "";
    private static String DB_NAME = "muji_hypo.db";
    private SQLiteDatabase mDataBase;
    private Context mContext;
 
 
    public DataBaseHelper(Context context) {
        super(context,DB_NAME,null,1);
 
 
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        this.mContext = context;
        dataBaseCheck();
    }
 
    private void dataBaseCheck() {
        File dbFile = new File(DB_PATH + DB_NAME);
        if (!dbFile.exists()) {
            dbCopy();
            Log.d(TAG,"Database is copied.");
        }
    }
 
 
    @Override
    public synchronized void close() {
        if (mDataBase != null) {
            mDataBase.close();
        }
        super.close();
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 테이블 구조 생성로직
        Log.d(TAG,"onCreate()");
    }
 
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        //Toast.makeText(mContext,"onOpen()",Toast.LENGTH_SHORT).show();
        Log.d(TAG,"onOpen() : DB Opening!");
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 테이블 삭제하고 onCreate() 다시 로드시킨다.
        Log.d(TAG,"onUpgrade() : DB Schema Modified and Excuting onCreate()");
    }
 
    // db를 assets에서 복사해온다.
    private void dbCopy() {
 
        try {
            File folder = new File(DB_PATH);
            if (!folder.exists()) {
                folder.mkdir();
            }
 
            InputStream inputStream = mContext.getAssets().open(DB_NAME);
            String out_filename = DB_PATH + DB_NAME;
            OutputStream outputStream = new FileOutputStream(out_filename);
            byte[] mBuffer = new byte[1024];
            int mLength;
            while ((mLength = inputStream.read(mBuffer)) > 0) {
                outputStream.write(mBuffer,0,mLength);
            }
            outputStream.flush();;
            outputStream.close();
            inputStream.close();
 
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("dbCopy","IOException 발생함");
        }
    }
}
cs

위의 소스를 보면 DataBaseHelper 생성자에서 생성과 동시에 dataBaseCheck() 함수에서 해당 db파일이 없다면 그 파일을 복사해오는 로직이 간단히 삽입되어 있다.

 

[MainActivity.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import wonpa.com.mujimakjihypothesistest.db.DataBaseHelper;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
 
public class MainActivity extends AppCompatActivity {
 
    float val = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        getVal();
    }
 
    public void getVal() {
 
        DataBaseHelper dbHelper = new DataBaseHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();    
 
        Cursor cursor = db.rawQuery("SELECT * FROM sampeTable where level=20 and name = ?",new String[]{"홍길동"});
        if (cursor.moveToNext())
        {
            val = cursor.getFloat(3);
        }
 
        cursor.close();
        dbHelper.close();
    }
 
}
cs

 

 

 

 

 

 

Comments