我想加載我的預先存在的數據庫到我的android設備。根據文檔如何使用SQLiteAssetHelper將預先存在的數據庫(從Excel創建)加載到Android設備中?
- 使用外部庫
SQLiteAssetHelper
可在github 然後:
我用這些步驟寫一個包裝類
public class DataBaseHelper extends SQLiteAssetHelper { private static final String TAG = "DataBaseHelper"; private static final String DATABASE_NAME = "test.db"; private static final int DATABASE_VERSION = 1; public DataBaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } private static final String TABLE_EXAMPLE = "example"; //example is the table name private static final String COLUMN_EXAMPLE_A = "A"; public String searchSomething() { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteDatabase db = getReadableDatabase(); //database name //parameters in query method String tables = "table"; // String[] projectionln = {"test"}; //which columns to return, null return all String selection = "row_name = example"; //which rows to return, formatted as WHERE clause excluding WHERE String[] selectionArgs = null; //you may include ? in selection which will be filled in by selectionArgs in order String groupBy = null; //how to group rows String having = null; //filter which row groups to include in cursor String sortOrder = null; //how to order the rows qb.setTables(tables); Cursor cursor = qb.query(db, projectionln, selection, selectionArgs, groupBy, having, sortOrder); cursor.moveToFirst(); return cursor.getString(1); }
}
實例化包裝類在
Activity
使用的數據庫
像這樣
public class MainActivity extends AppCompatActivity {
private DataBaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new DataBaseHelper(this);
final String name = db.searchSomething();
}
}
將您的數據庫文件到你的項目
main/src/assets/databases
下,例如,如果你的數據庫文件名是test.db的,該文件是在主/ src目錄/資產/數據庫/ test.db的Add to your database special meta-information like described here
在我完成了所有這些工作之後,我留下了一些錯誤,這些錯誤讓我相信我的數據庫文件格式不太好。我使用了github上的庫提供的數據庫,並且工作。
06-16 13:38:56.957 9281-9281/com.mycompany.programname E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mycompany.programname, PID: 9281
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.programname/com.mycompany.programname.mainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.getVersion()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.getVersion()' on a null object reference
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:178)
at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:254)
at com.mycompany.programname.DataBaseHelper.searchSomething(DataBaseHelper.java:75)
at com.mycompany.programname.HomescreenActivity.onCreate(HomescreenActivity.java:23)
at android.app.Activity.performCreate(Activity.java:5937)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
現在我的問題是,你如何獲得正確的sql db
格式的數據庫文件?我認爲這一定是問題所在。現在我有一個Excel文檔,我使用程序DB browser of SQLite的導入功能將其轉換爲sql格式。然後,我保存數據庫,然後有SQL擴展名,我在互聯網上搜索如何將其轉換爲.db,我發現你可以簡單地更改擴展名。但我不認爲這是真的。希望有人有任何想法或提示,因爲我堅持了一整天。