원하는 데이터를 python을 통해 web scraping하여 csv로 생성하였다.
해당 csv를 db로 변환하고 이를 app에서 활용하고자 한다.
이번 글은 몇일 간 실패한 db파일을 app에서 활용하는 방법이다.
아래 글을 참고하여 만들었다.
출처: https://icandooit.tistory.com/92 [i can do "IT"]
https://sites.google.com/site/ydhanslab/andeuloideu/oebusqlitedbneohgi
1. db로 만든 파일을 assets 폴더에 넣으면 되는줄 알았는데 그게 아니라 device에 있는 폴더로 옴겨줘야 한다.
2.
본인이 만든 db파일을 아래 경로로 넣어둔다.
project name : database
"C:\Users\dcsun\AndroidStudioProjects\database\app\src\main\assets\db\your_db_name.db"
위 파일이 결국 device에 아래와 같이 저장되어야 한다.
"/data/data/org.techtown.database/databases/your_db_name.db"
3. device에 저장된 후에는 다른 예시를 보고 쉽게 할 수 있다.
3.1. db open
openOrCreateDatabase("DB_TEST_W_S_BANK.db", MODE_PRIVATE, null);
3.2. db 조회
Cursor cursor = database.rawQuery("select bank,brunch_nm,brunch_ad from w_s_bank", null);
상세코드
xml에 textView와 button 2개를 추가하고 진행하였다.
package org.techtown.database;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.res.AssetManager;
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 java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
// 이번 주제와 상관 없으나, 나 같은 초보자는 txetView를 xml에 하나 띄워두고
// 어떻게 작동하는지 찍으며 가면 좋음....
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 이번 주제와 상관 없으나, 나 같은 초보자는 txetView를 xml에 하나 띄워두고
// 어떻게 작동하는지 찍으며 가면 좋음....
textView = findViewById(R.id.textView3); // 본인 textView id로 변경!
/////////////////////////////////////////////////////////////////
// DB가 있는지 확인하고 // 없으면 Local에서 device로 복사해주는 코드
try {
// 1번 isCheckDB 함수 : DB가 있는지 확인
boolean bResult = isCheckDB(); // DB가 있는지?
Log.d("MiniApp", "DB Check="+bResult);
if(!bResult){ // DB가 없으면 복사
// 2번 copyDB 함수 : DB를 local에서 device로 복사
copyDB(this);
}else{
}
} catch (Exception e) {
}
/////////////////////////////////////////////////////////////////
// DB가 들어왔으면 DB를 열고 조회되는지 확인!
// 3번 DB Open
Button button = findViewById(R.id.button4); // button id 수정필요(button4 --> your id)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String databaseName = "your_db_name.db";
createDatabase(databaseName);
}
});
// 4번 DB 호출!
Button button3 = findViewById(R.id.button6);// button id 수정필요(button6 --> your id)
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
executeQuery();
}
});
/////////////////////////////////////////////////////////////////
// 이번 주제와 상관 없으나, 나 같은 초보자는 txetView를 xml에 하나 띄워두고
// 어떻게 작동하는지 찍으며 가면 좋음....
public void println(String data) {
textView.append(data + "\n");
}
// 1번 isCheckDB 함수 : DB가 있는지 확인
public boolean isCheckDB(){
String filePath = "/data/data/org.techtown.database/databases/your_db_name.db";
File file = new File(filePath);
if (file.exists()) {
println("데이터베이스가 존재함 true" ); // debug
return true;
}
println("데이터베이스가 존재함 false" ); // debug
return false;
}
// 2번 copyDB 함수 : DB를 local에서 device로 복사
// DB를 복사하기
// assets의 /db/xxxx.db 파일을 설치된 프로그램의 내부 DB공간으로 복사하기
public void copyDB(Context mContext){
Log.d("MiniApp", "copyDB");
AssetManager manager = mContext.getAssets();
String folderPath = "/data/data/org.techtown.database/databases";
String filePath = "/data/data/org.techtown.database/databases/your_db_name.db";
File folder = new File(folderPath);
File file = new File(filePath);
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
println("db복사시작");
InputStream is = manager.open("db/your_db_name.db");
BufferedInputStream bis = new BufferedInputStream(is);
if (folder.exists()) {
println("폴더가있으면그냥넘어감");
}else{
println("폴더가없어서만들어줌");
folder.mkdirs();
}
if (file.exists()) {
println("파일이있어서삭제후재생성");
file.delete();
file.createNewFile();
}
println("파일을 만들자");
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
int read = -1;
byte[] buffer = new byte[1024];
while ((read = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, read);
}
bos.flush();
bos.close();
fos.close();
bis.close();
is.close();
} catch (IOException e) {
println("error나서 하다 못함//");
Log.e("ErrorMessage : ", e.getMessage());
}
}
// 3번 db open
private void createDatabase(String name) {
database = openOrCreateDatabase(name, MODE_PRIVATE, null);
println("createDatabase 호출됨.");
}
// 4번 db 호출되는지 확인
public void executeQuery() {
println("executeQuery 호출됨.");
// 본인의 columns name and table name
Cursor cursor = database.rawQuery("select bank,brunch_nm,brunch_ad from w_s_bank", null);
int recordCount = cursor.getCount();
println("레코드 개수 : " + recordCount);
// for (int i = 0; i < recordCount; i++) {
// 10개 레코드만 출력해보기
for (int i = 0; i < 10; i++) {
cursor.moveToNext();
// 본인의 데이터 타입이 string 인지 int인지에 맞게
String bank = cursor.getString(0);
String brunch_nm = cursor.getString(1);
String brunch_ad = cursor.getString(2);
// int age = cursor.getInt(3); // int 예시
println("레코드 #" + i + " : " + bank + ", " + brunch_nm + ", " + brunch_ad);
}
cursor.close();
}
}
궁금한게 있으면 댓글 주세요.
아는 범위에서 답변 드리겠습니다.