标签: android-sqlite

在Android上处理SQLite表和游标

我很难在Android上优化SQLite数据库处理的向后兼容性,复杂性和最佳实践.我找到了两种不被弃用的方法来管理SQLite数据库和游标:

  • 直接通过 android.database.sqlite
  • ContentProvider,CursorLoaderLoaderManager

我正在尝试设计数据库实现的未来证明.这意味着我想实施Google推广的最佳实践.我找到了一个关于实现ContentProvider的教程LoaderManager.

如果我遵循Lars Vogels提案,我的代码会被重复和不必要的复杂性所淹没.它对我的数据库中的某些表有意义.但是对于具有三个字段的映射表(例如)来实现它是没有意义的.此外,我遇到了问题ActionbarSherlock和回调接口LoaderManager(有一个解决方案,但它会使我的数据处理类加倍).

通过直接处理数据库和游标android.database.sqlite会引发资源管理问题(关闭游标!)并使我负责任务处理.

我的问题:
你如何在Android上处理SQLite数据库?
你什么时候去加倍努力,实施ContentProviderLoaderManager
你如何保持向后兼容?

我目前的方法:
我创建了一个将数据库I/O(via android.database.sqlite)与活动分开的类.所有方法都会打开和关闭它们在执行期间使用的游标(在我的活动之外),并根据需要返回对象或数据(而不是游标).I/O操作在中执行AsyncTasks.这种方法似乎非常弃用.

android android-contentprovider android-sqlite

7
推荐指数
1
解决办法
872
查看次数

sqlite:如何添加总时间hh:mm:ss where column datatype是DATETIME?

柱

这是我在sqlite db中的列的快照,其定义的模式中的数据类型具有DATETIME.现在我想应用一些聚合函数sum()来计算这个列的总和.

我使用的查询是:

select sum(total_expend_time) from timetable; 但它返回0.0作为结果.

database sqlite android-sqlite

7
推荐指数
1
解决办法
3939
查看次数

每次启动应用程序时资源ID都会更改吗

我将图像存储在drawable中,并将它们的资源ID存储在SQLite数据库中。我的数据库是在应用程序首次启动时创建的。

将图像ID保存在数据库中是否很好,还是每次应用程序启动时ID都会更改?

如果id更改,则在取回图像id时可能会收到错误。因此,将图像ID存储在数据库中是个好主意吗?

我需要将图像路径与其他相关数据一起存储在数据库中,这就是为什么我将图像ID存储在数据库中的原因。

android android-sqlite

7
推荐指数
2
解决办法
1390
查看次数

光标窗口分配2048 kb失败.#Open Cursors = 1(此proc = 1打开的#游标)

我正在制作一个使用数据库的Kiosk应用程序.该应用程序一直在前台运行.该应用程序有许多使用一个共享DataBaseHelper实例的线程.该应用程序完美无缺,但大多数时间在5或6小时后,我遇到这些异常,然后应用程序崩溃:

E/DataBaseHelper:2048 kb的游标窗口分配失败.#Open Cursors = 1(此proc = 1打开的#游标)

E/CursorWindow:由于错误-24,无法分配大小为2097152的CursorWindow'/data/user/0/com.kios.frm/databases/YadProjectDB.db'.

E/SQLiteLog:(14)无法打开[00bb9c9ce4]第30192行的文件

E/SQLiteLog:(14)语句中止16:[SELECT number FROM sms LIMIT 5]无法打开数据库文件

E/SQLiteQuery:异常:无法打开数据库文件(代码14);
查询:SELECT编号FROM sms LIMIT 5

E/SQLiteLog:(14)os_unix.c:30192:(24)
open(/data/user/0/com.kiosk.frm/databases/YadProjectDB.db-journal) -

我正确关闭了光标,但仍然获得了这些异常.那些例外是什么?这些例外的原因是什么?

主要活动

private DataBaseHelper db = null; // Global     
Run Code Online (Sandbox Code Playgroud)

MainActivity onCreate方法:

db = new DataBaseHelper(this);

new Thread(new Runnable() {
@Override
public void run() {
    while (threadRunningFlag) {

    Cursor result = null;
    try {

        result = db.getData("SELECT " + DataBaseHelper.SMS_COLUMN_PHONE_NUMBER  + " FROM " + DataBaseHelper.SMS_TABLE_NAME + " LIMIT 5");
        if (result != null && result.getCount() > …
Run Code Online (Sandbox Code Playgroud)

database android android-cursor android-sqlite android-4.4-kitkat

7
推荐指数
1
解决办法
1万
查看次数

数据库存储在哪里 - Cordova-sqlite-storage

请不要标记此重复项。在发布这个之前,我搜索了很多并且浏览了很多帖子。我在科尔多瓦工作。我有一个 android 5.1.1 设备,我正在测试该应用程序。我使用以下代码打开了一个数据库 -

var db = window.sqlitePlugin.openDatabase({name: 'my.db', location: 'default'});
Run Code Online (Sandbox Code Playgroud)

这运行良好,我也可以执行 CURD,但是,我无法在设备上或笔记本电脑上的应用程序文件夹中找到数据库。我没有root设备。也无法在我的应用程序文件夹中找到 /data/data//databases/。

在哪里可以找到数据库文件?

cordova android-sqlite

7
推荐指数
1
解决办法
1326
查看次数

Room 编译问题 - 列引用外键,但它不是索引的一部分

我是 Android 应用程序开发的新手,正在创建一个具有存储位置的 Trips 的应用程序。

我收到编译错误:“trip_Id 列引用外键,但它不是索引的一部分。每当修改父表时,这可能会触发全表扫描,因此强烈建议您创建一个覆盖此列的索引。”

我有两张表:行程和位置。

我尝试在各自的类中对 tripId 和 locationId 建立索引,但这并不能解决问题。

一次旅行有它的 ID (PK)、标题、描述和优先级。

位置具有该地点的 locationId (PK)、tripId(FK)、locationName 和 LatLng。

@Entity(tableName = "location_table",
        foreignKeys = @ForeignKey(entity = Trip.class, parentColumns = "location_Id", childColumns = "trip_Id"),
        indices = {@Index(value = {"locationId"}, unique = true)})
public class Location {

    @PrimaryKey(autoGenerate = true)
    private int locationId;

    @ColumnInfo (name = "trip_Id")
    private int tripId;

    private String locationName;

    @TypeConverters(LatLngConverter.class)
    private LatLng latLng;


@Entity(tableName = "trip_table", indices = {@Index(value = {"id"}, unique = true)})

public class …
Run Code Online (Sandbox Code Playgroud)

java android android-sqlite android-room

7
推荐指数
1
解决办法
6622
查看次数

Android Room,如何保存一个实体,其中变量之一是密封类对象

我想在我的 Room 数据库中保存一个对象,其中一个变量可以是一种类型或另一种类型。我认为密封类是有意义的,所以我采取了这种方法:

sealed class BluetoothMessageType() {
    data class Dbm(
        val data: String
    ) : BluetoothMessageType()

    data class Pwm(
        val data: String
    ) : BluetoothMessageType()
}
Run Code Online (Sandbox Code Playgroud)

甚至是这样,但没有必要。我发现这个给了我更多的错误,因为它不知道如何处理 open val,所以如果我找到第一个版本的解决方案,无论如何我都会很高兴。

sealed class BluetoothMessageType(
    open val data: String
) {
    data class Dbm(
        override val data: String
    ) : BluetoothMessageType()

    data class Pwm(
        override val data: String
    ) : BluetoothMessageType()
}
Run Code Online (Sandbox Code Playgroud)

然后是实体类

@Entity(tableName = MESSAGES_TABLE_NAME)
data class DatabaseBluetoothMessage(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0L,
    val time: Long = Instant().millis,
    val …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-sqlite android-room sealed-class

7
推荐指数
1
解决办法
2822
查看次数

在 Android 上使用 Room 时如何安装最新版本的 Sqlite aar

我正在调查我当前应用程序中的 Android Room 数据库。

我正在尝试通过使用最新版本来安装最新版本的 Sqlite aar

我曾尝试放置aar在我的数据库模块libs文件夹和引用,在我的gradle这个文件但SQLite的版本显示的总是3.22.0aar3.34.0

我需要遵循哪些步骤来覆盖默认提供的 Sqlite 版本并使用我下载的 aar 文件?

或者

这不可能吗?

sqlite.org 网站有这个

可以通过三种方式将 SQLite Android 绑定添加到应用程序:

通过将预构建的 aar 文件添加到应用程序 Android Studio 项目中。通过构建 aar 文件,然后将其添加到应用程序 Android Studio 项目中,如 (1) 所示。通过将 SQLite Android 绑定源代码添加到其他应用程序代码并将其与其他应用程序代码一起构建。默认情况下,SQLite Android 绑定支持 Android API 级别 16 及更高级别(Android 4.1 及更高版本)。还有一个单独的版本支持 Android API 级别 9 及更高级别(Android 2.3 及更高版本)。如果您希望使用与 API 级别 9 兼容的版本,请注意获取代码所涉及的额外步骤。

  1. 使用预先构建的 aar 文件 这是最直接的选项。“aar”文件类似于 jar 文件,不同之处在于它可能包含已编译的 Java 类和本机代码。此页面提供了可用于 API 级别 16 及更高级别的最新 SQLite 版本的 …

android android-sqlite android-room

7
推荐指数
1
解决办法
429
查看次数

带有多个非强制性过滤器的 Room DAO

在我的应用程序中,用户可以在每个组合中使用多个过滤器来过滤他们的数据(仅应用一个、多个或不应用)。

在此之前,我只有一个过滤器,所以每次应用它时,我都在切换 DAO 方法。现在我有 6 个过滤器,所以有几十种组合,因此为每个组合创建一个方法是不可能的。我也不能大量修改我的数据库,因为它已经可供用户使用。

我当前的代码如下所示:

@Query("SELECT id, name, date FROM UserData")
fun getAll(): DataSource.Factory<Int, UserItem> //no filters

@Query("SELECT id, name, date FROM UserData WHERE name LIKE '%' || :search  || '%'")
fun getAllFiltered(query: String): DataSource.Factory<Int, UserItem> //one filter applied
Run Code Online (Sandbox Code Playgroud)

有没有办法修改查询,以便所有过滤器组合都有一种方法?

更新:

这是我的数据类,我想过滤哪些实例:

@Entity(tableName = "UserItem")
data class UserItem(

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    val id: Long? = null,

    @ColumnInfo(name = "created_at")
    val createdAt: Date,

    @ColumnInfo(name = "is_uploaded")
    val isUploaded: Boolean,

    @ColumnInfo(name = "name")
    val name: String,

    @ColumnInfo(name …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-sqlite android-room

7
推荐指数
1
解决办法
219
查看次数

依赖项的 AAR 元数据中指定的 minCompileSdk (31) 大于此模块的compileSdkVersion (android-30)

这是一个知识共享问题。

我有一个反应本机项目,compileSdkVersiontargetSdkVersion设置为30.
升级博览会版本和相关软件包后,Android 应用程序未构建。
日志中出现以下错误:

The minCompileSdk (31) specified in a
dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties)
is greater than this module's compileSdkVersion (android-30).
Dependency: androidx.sqlite:sqlite-framework:2.2.0.
AAR metadata file: /home/<MY USERNAME>/.gradle/caches/transforms-2/files-2.1/f7bf6c20b6aaa8d6365a0aa8e2ddf180/sqlite-framework-2.2.0/META-INF/com/android/build/gradle/aar-metadata.properties.

Run Code Online (Sandbox Code Playgroud)

花了很多时间试图找出问题所在

android android-sqlite flipper react-native expo

7
推荐指数
1
解决办法
3866
查看次数