개발이야기/Android

안드로이드 스튜디오, csv file을 DB로 생성하여 Device에 저장, 불러오기

원효대사해골물 2020. 9. 20. 17:54

원하는 데이터를 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

 

외부 sqlite DB 넣기 - ydhan's lab

게시자: Yeong Deok Han, 2017. 12. 4. 오후 10:14 /* =====외부 DB 불러와 보여주기===== 레퍼런스: http://limts28.tistory.com/456 https://stackoverflow.com/questions/513084/ship-an-application-with-a-database/11803319#11803319 http://egloos.z

sites.google.com

https://androi.tistory.com/52

 

android에서 assets에 있는 기존 sqlite DB 사용하기

android에서 assets에 있는 기존 sqlite DB를 사용하기 위한 방법이다. 1. sqlite 용 DB를 만든다.  ex) history.db 2. assets 폴더에 복사한다. ex) assets/db/history.db 3. 앱 처음 실행시 앱의 시스템 내부로..

androi.tistory.com

 

 

 

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();
    }
    

}
        
        
        
        
        
        

 

궁금한게 있으면 댓글 주세요.

아는 범위에서 답변 드리겠습니다.