1. 程式人生 > >Android 中 匯入已存在的 sqlite資料庫時出現的問題

Android 中 匯入已存在的 sqlite資料庫時出現的問題

1》剛開始時我匯入sqlite資料庫放在了asserts下面,我按照網上的例子最後發現是我的“包名”出了問題,我現在用Android studio 以前用的時eclipse  ,所以習慣性的我就應用了mainfaset下面的包名了,所以不管我怎麼讀取sqlite檔案總是打不開資料庫。。。。。。。包名要到grid裡面去拿,下面是建立資料庫的程式碼。。

package com.yzkj.utils.twicedb;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/12/7. */ public class DataBaseHelper { //資料庫儲存路徑
String filePath = "data/data/yzkj.com.android_zdzy/herbsinfo.db"; //資料庫存放的資料夾 data/data/com.main.jh 下面 String pathStr = "data/data/yzkj.com.android_zdzy"; SQLiteDatabase database; public SQLiteDatabase openDatabase(Context context) { System.out.println("filePath:" + filePath); File jhPath = new File(filePath
); //檢視資料庫檔案是否存在 if (jhPath.exists()) { Log.i("test", "存在資料庫"); //存在則直接返回開啟的資料庫 return SQLiteDatabase.openOrCreateDatabase(jhPath, null); } else { //不存在先建立資料夾 File path = new File(pathStr); Log.i("test", "pathStr=" + path); try { if (!path.exists()){ path.mkdir(); } }catch (Exception e){ Log.e("test", "建立失敗"+e); } try { Log.e("test", "444444444444444444444444"); //得到資源 AssetManager am = context.getAssets(); //得到資料庫的輸入流 InputStream is = am.open("herbsinfo.db"); Log.e("33333333333333333", is + ""); //用輸出流寫到SDcard上面 FileOutputStream fos = new FileOutputStream(jhPath); Log.e("test", "fos=" + fos); Log.e("test", "jhPath=" + jhPath); //建立byte陣列 用於1KB寫一次 byte[] buffer = new byte[1024]; int count = 0; while ((count = is.read(buffer)) > 0) { Log.e("test", "得到"); fos.write(buffer, 0, count); } //最後關閉就可以了 fos.flush(); fos.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } //如果沒有這個資料庫 我們已經把他寫到SD卡上了,然後在執行一次這個方法 就可以返回資料庫了 return openDatabase(context); } } // /** // * 查詢本地草藥 // * @param sql // * @return // */ public List<Herbs> QueCy(String sql,SQLiteDatabase db) { List<Herbs> list = new ArrayList<Herbs>(); Cursor cursor = null; try{ cursor = db.rawQuery(sql,null); }catch (Exception e){ Log.e("-----------","--------------"+e); } if(cursor.getCount()==0) { return list; } if (cursor != null&& cursor.getCount() >= 1 ) { cursor.moveToFirst(); while (!cursor.isAfterLast()) { //id String herbid = cursor.getString(cursor .getColumnIndex("herbid")); //藥名 String cyname = cursor.getString(cursor .getColumnIndex("cyname")); //丁香--DX:[11--22] String namereamrk = cursor.getString(cursor .getColumnIndex("namereamrk")); //要單位 String dw = cursor.getString(cursor .getColumnIndex("dw")); //煎服 String jf = cursor.getString(cursor .getColumnIndex("jf")); //藥價格 double price = cursor.getDouble(cursor.getColumnIndex("price")); Herbs herbs = new Herbs(); herbs.setHerbid(herbid); herbs.setCyname(cyname); herbs.setNamereamrk(namereamrk); herbs.setDw(dw); herbs.setJf(jf); herbs.setPrice(price); list.add(herbs); cursor.moveToNext(); } cursor.close(); } return list; } }
建立完成了最後有遇到問題,,,,,Sqlite Expert personal軟體開啟的我的db檔案,我就按照上面的
欄位進行實體化,最後發現這個軟體會自動生成一個 rowid的欄位,
導致我程式執行出錯:Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
最後發現了,把多餘的實體欄位刪掉就沒事了。。。。可算是弄好了,弄了將近一天了,哈哈哈哈。。最好到首個啟動的activity中初始化複製資料庫到本地。