2015-06-16 32 views
0

我想加載我的預先存在的數據庫到我的android設備。根據文檔如何使用SQLiteAssetHelper將預先存在的數據庫(從Excel創建)加載到Android設備中?

  1. 使用外部庫SQLiteAssetHelper可在github
  2. 然後:

    我用這些步驟寫一個包裝類

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

    }

  3. 實例化包裝類在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,我發現你可以簡單地更改擴展名。但我不認爲這是真的。希望有人有任何想法或提示,因爲我堅持了一整天。

    回答

    3

    現在我有一個excel文件,我將其轉換爲sql格式。

    我不知道你認爲「sql格式」是什麼。

    我在互聯網上搜索如何將其轉換爲.db,我發現你可以簡單地改變擴展名。這是真的?

    如果「SQL格式」是指「包含一系列SQL語句的純文本文件」,你可以嘗試使用任意數量的SQLite的裝備工具,如sqlite3 SQLite自帶的程序。或者,嘗試通過在您最喜愛的搜索引擎上搜索sqlite clients找到的SQLite客戶端。

    或者,編寫一個在開發機器上運行的程序,將您的Excel數據轉換爲SQLite數據庫。例如,在其APK版本中,my book帶有一個預先打包的SQLite數據庫形式的全文索引,我通過SQLiteAssetHelper加載。我的圖書出版流程的一部分是使用Ruby腳本和SQLite Ruby gem來創建該數據庫。

    相關問題