안드로이드에서는 기본적으로 내부 파일 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
참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jogilsang&logNo=221605185222
'APP > 안드로이드' 카테고리의 다른 글
android firebase를 사용한 FCM push notification (0) | 2022.10.14 |
---|---|
JAVA안드로이드로 바코드 스캐너 만들기 (0) | 2022.03.15 |
안드로이드 리사이클러뷰에서 화면 전환 (0) | 2022.03.10 |
안드로이드 volly사용 (0) | 2022.02.16 |