如何使用SQLiteAssetHelper将预先存在的数据库(从Excel创build)加载到Android设备中?

我想加载我的预先存在的数据库到我的Android设备。

我使用了这些步骤:

  1. 在github上使用外部库SQLiteAssetHelper
  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(); } } 
  1. 如果你的数据库文件名是test.db,这个文件位于main / src / assets / databases / test.db中,那么把你的数据库文件放到main / src / assets /

  2. 添加到您的数据库特殊的元信息像这里描述的

完成这一切后,我留下了错误,使我相信我的数据库的文件格式不是很好。 我使用了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文档,我使用SQLite的程序DB浏览器的导入function转换为SQL格式。 然后我保存数据库,然后有SQL扩展名,我在互联网上search如何将其转换为.db,我发现你可以简单地改变扩展名。 但我不认为这是真的。 希望有人有任何想法或提示,因为我坚持了一整天。

现在我有一个Excel文件,我将其转换为SQL格式。

我不知道你认为“sql格式”是什么。

我在互联网上search如何将其转换为.db,我发现你可以简单地改变扩展名。 这是真的?

没有。

如果“sql格式”表示“包含一系列SQL语句的纯文本文件”,则可以尝试将其与任何数量的SQLite配备的工具一起使用,例如SQLite自带的sqlite3程序。 或者,尝试通过在您最喜爱的search引擎上searchsqlite clientsfind的SQLite客户端。

或者,写一个自己的开发计算机上运行的程序,将您的Excel数据转换成SQLite数据库。 例如, 我的书在其APK版本中,带有一个预先打包的SQLite数据库的全文索引,该数据库通过SQLiteAssetHelper加载。 我的图书出版stream程的一部分是使用Ruby脚本和SQLite Ruby gem创build数据库。