[英]How to load pre-existing database (created from Excel) with SQLiteAssetHelper into Android device?
我正在尝试将我现有的数据库加载到我的android设备中。
我使用了以下步骤:
SQLiteAssetHelper
然后根据文档:编写包装器类
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();
}
}
例如,如果数据库文件名为test.db,则将数据库文件放入项目的main/src/assets/databases
下,文件位于main / src / assets / databases / test.db中。
完成所有这些操作后,我将留下一些错误,这些错误使我相信我的数据库文件格式尚不理想。 我使用了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程序数据库浏览器中的导入功能将其转换为sql格式。 然后我保存数据库,该数据库具有sql扩展名,我在互联网上搜索了如何将其转换为.db,然后发现您可以简单地更改扩展名。 但是我认为那不是真的。 希望有人有任何想法或提示,因为我坚持了一天以上。
现在我有一个Excel文档,我将其转换为sql格式。
我不知道您认为“ sql格式”是什么。
我在互联网上搜索了如何将其转换为.db,然后发现您只需更改扩展名即可。 这是真的?
没有。
如果“ sql格式”表示“包含一系列SQL语句的纯文本文件”,则可以尝试将其与任意数量的配备SQLite的工具一起使用,例如SQLite本身附带的sqlite3
程序。 或者,尝试通过在您喜欢的搜索引擎上的sqlite clients
上进行搜索找到的SQLite客户端。
或者,编写一个在您的开发计算机上运行的程序,该程序将Excel数据转换为SQLite数据库。 例如, 我的书在其APK版本中以预包装的SQLite数据库的形式带有全文索引,我可以通过SQLiteAssetHelper
加载该数据库。 我的书出版过程的一部分是使用Ruby脚本和SQLite Ruby gem创建该数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.