Android 自定义 SQLite 构建 - 无法打开数据库

2023-12-21

我的目标是构建一个自定义版本的 SQLite(特别是启用了 R-Tree)以包含在我的 Android 项目中。动机源于:

Android SQLite R-Tree - 如何安装模块? https://stackoverflow.com/questions/6132442/android-sqlite-r-tree-how-to-install-module

SQLite 有一些关于如何执行此操作的说明:

http://www.sqlite.org/android/doc/trunk/www/index.wiki http://www.sqlite.org/android/doc/trunk/www/index.wiki

我已经编译了 SQLite 并成功地将共享库包含在我的项目中。我遇到的问题是,一旦我调用诸如getReadableDatabase() or getWriteableDatabase()我收到 SQLiteCantOpenDatabaseException。

值得注意的是,我正在使用:

import org.sqlite.database.sqlite.SQLiteDatabase;

import org.sqlite.database.sqlite.SQLiteOpenHelper;

代替:

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

为了通过 NDK 和 JNI 使用自定义 SQLite 构建。

MySQLite助手:

public class MySQLiteHelper extends SQLiteOpenHelper {

    static {
        System.loadLibrary("sqliteX");
    }

    private static final String DATABASE_NAME = "mydata.db";
    private static final int DATABASE_VERSION = 1;
    Context myContext;

    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        myContext = context;
    }

    public void getEntry(){
        SQLiteDatabase db = this.getReadableDatabase();
        db.close();
    }

    public void createEntry(){
        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        //...
        //...
        db.close();
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
         String create_rtree = "CREATE VIRTUAL TABLE demo_index USING rtree(\n" +
                "   id,              -- Integer primary key\n" +
                "   minX, maxX,      -- Minimum and maximum X coordinate\n" +
                "   minY, maxY       -- Minimum and maximum Y coordinate\n" +
                ");";

        database.execSQL(create_rtree);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(MySQLiteHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + "demo_index");
        onCreate(db);
    }

}

主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MySQLiteHelper helper = new MySQLiteHelper(this);
    helper.createEntry();
    setContentView(R.layout.activity_my);
}

堆栈跟踪:

10-29 13:45:38.356    2360-2360/com.example.nathanielwendt.lstrtree E/SQLiteLog﹕ (14)   os_unix.c:30589: (2) open(//arrrr.db) -
10-29 13:45:38.376    2360-2360/com.example.nathanielwendt.lstrtree E/SQLiteDatabase﹕ Failed to open database 'arrrr.db'.
    org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
        at org.sqlite.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
        at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:217)
        at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:201)
        at     org.sqlite.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:467)
        at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:189)
        at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:181)
        at org.sqlite.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:809)
        at org.sqlite.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:794)
        at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:699)
        at org.sqlite.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:722)
        at org.sqlite.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:228)
        at org.sqlite.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:168)
        at com.example.nathanielwendt.lstrtree.MySQLiteHelper.createEntry(MySQLiteHelper.java:65)
        at com.example.nathanielwendt.lstrtree.MyActivity.onCreate(MyActivity.java:25)

我在这里看到了关于这个相同异常的几篇文章,但它们似乎都与输入来自磁盘上其他位置的数据库,其中未正确设置文件路径。这似乎是最相关的帖子:Android SQLiteOpenHelper无法打开数据库文件 https://stackoverflow.com/questions/6202926/android-sqliteopenhelper-cannot-open-database-file,但所有建议都不起作用。

我已经用两部不同的手机和模拟器尝试过此操作,但收到了相同的错误。此外,我已经用默认的 android sqlite 导入替换了上面讨论的导​​入,并且它工作得很好(假设我不尝试创建 R-Tree,因为它不包含在默认的 Android SQLite 安装中)。将数据库目录和 .db 文件的权限更改为 777 并没有解决问题,将 WRITE_PERMISSION 添加到我的清单中也没有解决问题。


这是 SQLite Android 绑定中的不兼容性。

原始的Android代码打开数据库是这样的:

db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
        Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
        mFactory, mErrorHandler);

while org.sqlite.database.sqlite.SQLiteOpenHelper不使用上下文:

db = SQLiteDatabase.openOrCreateDatabase(
        mName, mFactory, mErrorHandler
);

这意味着数据库路径不会添加到数据库名称前面。

使用类似这样的方法来获取数据库的完整路径:

String path = context.getDatabasePath(DATABASE_NAME).getPath();

并将其用作数据库名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 自定义 SQLite 构建 - 无法打开数据库 的相关文章

随机推荐