【问题标题】:Can't use SQLite in Nativescript and external device SDK 25, Android 7.1.2无法在 Nativescript 和外部设备 SDK 25、Android 7.1.2 中使用 SQLite
【发布时间】:2023-03-13 17:46:01
【问题描述】:

我一直在尝试让 Nativescript 与 SQLite 和我运行 Nougat (7.1.2)、SDK 25 的外部设备一起使用。

我收到以下错误:

Error: java.lang.NoClassDefFoundError: android.database.sqlite.SQLiteDatabase$OpenParams

我有一个扩展 SQLiteOpenHelper 的类

class DatabaseHelper extends android.database.sqlite.SQLiteOpenHelper {
    static constructorCalled: boolean = false;

    constructor(context: android.content.Context) {
        super(context, '/data/user/0/org.nativescript.synctest/databases/swiftr.sqlite', null, 2);
        DatabaseHelper.constructorCalled = true;

        return global.__native(this);
    }

    onCreate(db: android.database.sqlite.SQLiteDatabase) { }

    onUpdate(
        db: android.database.sqlite.SQLiteDatabase,
        oldVersion: number,
        newVersion: number
    ) { }
}

我正在尝试像这样打开 SQLite 数据库:

const mOpenHelper: android.database.sqlite.SQLiteOpenHelper = new DatabaseHelper(application.android.context);

const sql = "SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE '%sqlite_%'";
const cursor = mOpenHelper.getReadableDatabase().rawQuery(sql, null);

const tables: string[] = [];

if (cursor.moveToFirst()) {
    while (!cursor.isAfterLast() ) {
        tables.push(cursor.getString(cursor.getColumnIndex('name')));
    }
}

console.log('Tables: ', [tables]);

然后当我尝试在组件中使用这个类时,我得到了错误, Error: java.lang.NoClassDefFoundError: android.database.sqlite.SQLiteDatabase$OpenParams

我进行了一些挖掘,发现SQLiteDatabase$OpenParams仅在版本27中添加到SDK中。然后我尝试将app.gradle中的compileSdkVersion设置为25,现在我收到以下错误:

app.gradle:

android {
  compileSdkVersion 25
  defaultConfig {
    minSdkVersion 25
    generatedDensities = []
  }
  aaptOptions {
    additionalParameters "--no-version-vectors"
  }
}

错误:

AAPT: error: style attribute 'android:attr/forceDarkAllowed' not found.

AAPT: error: resource android:attr/colorError not found.

AAPT: error: style attribute 'android:attr/keyboardNavigationCluster' not found.

这里我只列出了三个,但其中有很多。

谁能帮我解决这个问题...我真的很难解决这个问题。

提前致谢。

【问题讨论】:

    标签: java android sqlite nativescript


    【解决方案1】:

    编译 SDK 版本不能更改,必须是 Android Q 和最新版本的 NativeScript (6.x)。

    此外,您不能使用设备中不可用的 API。如果您的设备运行的是 Android 7.x,则不能使用实际上仅在 Android 8.x(API 级别 27)上引入的 API 方法。

    如果您打算使用在您的应用支持的操作系统版本之一中可能不可用的 API,那么您应该有条件地运行它。在这里,您将检查平台版本是否 >= 27 并运行特定代码。

    【讨论】:

    • 如何在 NativeScript 中使用 SQLite 3.9 API?设备将始终使用 Nougat 7.1.2,但 NS 使用的 API for SQLite 版本高于可用版本?有什么方法可以强制 NS 使用 SQLite 的 3.9 API?
    • 你必须理解 NS 只是一个 JavaScript 运行时,它所做的只是用 JavaScript 编写你的原生应用程序的能力。 NS 甚至原生 Android 应用程序都不能让您使用设备中不可用的 API,至少在有支持库之前是这样。
    • 是否可以使用 androidx.sqlite:sqlite:2.1.0-alpha01 之类的东西来使用 25 SDK API 打开连接?
    • 是的,您可以使用支持库。
    【解决方案2】:

    好的,所以我结束了使用SQLite Android Bindings 解决这个问题。

    看看...https://sqlite.org/android/doc/trunk/www/index.wiki

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多