APP/안드로이드

안드로이드 SQLite사용

자코린이 2022. 3. 16. 03:10

안드로이드에서는 기본적으로 내부 파일 DB인 SQLite를 제공합니다.

 

이번에는 이 점을 활용해 외부 DB에서 내부에 있는 SQLite로 임포트하는 법을 알아보겠습니다.

 

저는 저번 글에서 하던 barcode를 인식하고, 그 결과값을 가져오기 위해 사용합니다.

 

처음으로는 DBHelper.java파일을 만듭니다.

이 파일은 DB가 없으면 생성하고, assets폴더에 있는 *.db파일을 복사해서 내부에 생성해주는 클래스 입니다.

 

package example.zxing;

import android.content.Context;
import android.database.SQLException;
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 DBHelper extends SQLiteOpenHelper {
//    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
//        super(context, name, factory, version);
//    }


    private static String TAG = "DataBaseHelper"; //Logcat에 출력할 태그이름

    //디바이스 장치에서 데이터베이스의 경로

    // TODO : assets 폴더에 있는 경우 "", 그 외 경로기입
    private static String DB_PATH = "";
    // TODO : assets 폴더에 있는 DB명 또는 별도의 데이터베이스 파일이름
    private static String DB_NAME ="part.db";

    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DBHelper(Context context)
    {
        super(context, DB_NAME, null, 2);// 1은 데이터베이스 버젼
        if(android.os.Build.VERSION.SDK_INT >= 17){
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
        }
        else
        {
            DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        }
        this.mContext = context;
    }

    public void createDataBase() throws IOException
    {
        //데이터베이스가 없으면 asset폴더에서 복사해온다.
        boolean mDataBaseExist = checkDataBase();
        if(!mDataBaseExist)
        {

            this.getReadableDatabase();
            this.close();
            try
            {
                //Copy the database from assests
                copyDataBase();
                Log.e(TAG, "createDatabase database created");
            }
            catch (IOException mIOException)
            {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }

    ///data/data/your package/databases/Da Name <-이 경로에서 데이터베이스가 존재하는지 확인한다
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }

    //assets폴더에서 데이터베이스를 복사한다.
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    //데이터베이스를 열어서 쿼리를 쓸수있게만든다.
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close()
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

 

그 후 DB에 있는 칼럼과 똑같은 이름으로 getter와 setter를 만들 클래스를 만듭니다.

저는 part테이블을 사용하고 있습니다.

package example.zxing;

public class Part {

            public String kind;  // 종류
            public String code; // 식별번호
            public String barcode; // 바코드번호
            public String name; // 제품명
            public String std; // 개수
            public String qtybox; //박스당 갯수
            public String box; //박스 수
            public String qty;// 낯개 수

            // TODO : get,set 함수 생략
            public String getKind() {
                return kind;
            }

            public void setKind(String kind) {
                this.kind = kind;
            }

            public String getCode() {
                return code;
            }

            public void setCode(String code) {
                this.code = code;
            }

            public String getBarcode() {
                return barcode;
            }

            public void setBarcode(String barcode) {
                this.barcode = barcode;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getStd() {
                return std;
            }

            public void setStd(String std) {
                this.std = std;
            }

            public String getQtybox() {
                return qtybox;
            }

            public void setQtybox(String qtybox) {
                this.qtybox = qtybox;
            }

            public String getBox() {
                return box;
            }

            public void setBox(String box) {
                this.box = box;
            }

            public String getQty() {
                return qty;
            }

            public void setQty(String qty) {
                this.qty = qty;
            }

        }

 

sql을 날리고, 그 결과를 배열로 저장하는 클래스입니다.

저는 where절을 사용하려고 합니다.

package example.zxing;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DataAdapter {
    protected static final String TAG = "DataAdapter";

    // TODO : TABLE 이름을 명시해야함
    protected static final String TABLE_NAME = "part";

    private final Context mContext;
    private SQLiteDatabase mDb;
    private DBHelper mDbHelper;

    public DataAdapter(Context context)
    {
        this.mContext = context;
        mDbHelper = new DBHelper(mContext);
    }

    public DataAdapter createDatabase() throws SQLException
    {
        try
        {
            mDbHelper.createDataBase();
        }
        catch (IOException mIOException)
        {
            Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
            throw new Error("UnableToCreateDatabase");
        }
        return this;
    }

    public DataAdapter open() throws SQLException
    {
        try
        {
            mDbHelper.openDataBase();
            mDbHelper.close();
            mDb = mDbHelper.getReadableDatabase();
        }
        catch (SQLException mSQLException)
        {
            Log.e(TAG, "open >>"+ mSQLException.toString());
            throw mSQLException;
        }
        return this;
    }

    public void close()
    {
        mDbHelper.close();
    }

    public List getTableData(String barcode)
    {
        try
        {
            // Table 이름 -> antpool_bitcoin 불러오기
            String sql ="SELECT * FROM " + TABLE_NAME+ " WHERE barcode Like " +"'"+barcode+"';";

            // 모델 넣을 리스트 생성
            List userList = new ArrayList();

            // TODO : 모델 선언
            Part part = null;

            Cursor mCur = mDb.rawQuery(sql, null);
            if (mCur!=null)
            {
                // 칼럼의 마지막까지
                while( mCur.moveToNext() ) {

                    // TODO : 커스텀 모델 생성
                    part = new Part();

                    // TODO : Record 기술
                    // id, name, account, privateKey, secretKey, Comment
                    part.setKind(mCur.getString(0));
                    part.setCode(mCur.getString(1));
                    part.setBarcode(mCur.getString(2));
                    part.setName(mCur.getString(3));
                    part.setStd(mCur.getString(4));
                    part.setQtybox(mCur.getString(5));
                    part.setBox(mCur.getString(6));
                    part.setQty(mCur.getString(7));



                    // 리스트에 넣기
                    userList.add(part);
                }

            }
            return userList;
        }
        catch (SQLException mSQLException)
        {
            Log.e(TAG, "getTestData >>"+ mSQLException.toString());
            throw mSQLException;
        }
    }
}

 

사용하려는 액티비티 클래스에 아래 내용을 넣으시면 됩니다.

public String barcodeResult;
public String result;
public List<Part> userList ;
    
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initLoadDB();
  
    }
    private void initLoadDB() {

        DataAdapter mDbHelper = new DataAdapter(getApplicationContext());
        mDbHelper.createDatabase();
        mDbHelper.open();



        // db에 있는 값들을 model을 적용해서 넣는다.
        userList = mDbHelper.getTableData(barcodeResult);
        result = userList.toString();
        // db 닫기
        mDbHelper.close();
    }

 

여기까지 바코드 결과를 받아 SQLite로 검색하는 것까지 했습니다.

 

간단한 소스 코드 : https://github.com/whiteout367/androidBarcodeScaner

 

GitHub - whiteout367/androidBarcodeScaner

Contribute to whiteout367/androidBarcodeScaner development by creating an account on GitHub.

github.com

 

 

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jogilsang&logNo=221605185222

 

안드로이드 - SQLite DB 만들고 테이블 데이터 가져오기, DB Browser

안드로이드 앱을 만들때, sqlite는 기본적으로 사용되는 db이다 아래 코드는 앱에서 db에 데이터를 넣고, ...

blog.naver.com