- php 캐쉬제거
- jquery 바코드생성
- 타임피커
- javascript 유효성체크
- ViewData
- 강제이동
- 맥 오라클설치
- 파일업로드 유효성체크
- 파일업로드 체크
- XSS방어
- Mac Oracle
- 바코드 스캔하기
- javascript 바코드스캔
- django 엑셀불러오기
- asp.net core Select
- 하드 윈도우 복사
- 말줄임표시
- TempData
- ViewBag
- asp.net dropdownlist
- jquery 바코드
- 바코드 생성하기
- 404에러페이지
- javascript 바코드 생성
- XSS PHP
- 하드 마이그레이션
- ASP.Net Core 404
- SSD 복사
- asp.net Select
- javascript redirection
웹개발자의 기지개
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 폴더를 생성해 본다.
상기 도식화면과 같이 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 |
'안드로이드' 카테고리의 다른 글
Installation failed with message Failed to establish session. (0) | 2020.01.26 |
---|---|
모바일 해상도별로 이미지 자동 만들고 이용하기 (앱이미지 자동생성) (2) | 2020.01.17 |
패키지명을 한꺼번에 변경하기 (Refactor) (0) | 2020.01.06 |
AndroidManifest.xml 에 대하여 (0) | 2020.01.02 |
FirebaseInstanceIdService, onTokenRefresh() 가 deprecated 되었다. (0) | 2020.01.01 |