繁体   English   中英

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

[英]How to load pre-existing database (created from Excel) with SQLiteAssetHelper into Android device?

我正在尝试将我现有的数据库加载到我的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下,文件位于main / src / assets / databases / test.db中。

  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程序数据库浏览器中的导入功能将其转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM