我很难在Android上优化SQLite数据库处理的向后兼容性,复杂性和最佳实践.我找到了两种不被弃用的方法来管理SQLite数据库和游标:
android.database.sqlite ContentProvider,CursorLoader和LoaderManager 我正在尝试设计数据库实现的未来证明.这意味着我想实施Google推广的最佳实践.我找到了一个关于实现ContentProvider和的教程LoaderManager.
如果我遵循Lars Vogels提案,我的代码会被重复和不必要的复杂性所淹没.它对我的数据库中的某些表有意义.但是对于具有三个字段的映射表(例如)来实现它是没有意义的.此外,我遇到了问题ActionbarSherlock和回调接口LoaderManager(有一个解决方案,但它会使我的数据处理类加倍).
通过直接处理数据库和游标android.database.sqlite会引发资源管理问题(关闭游标!)并使我负责任务处理.
我的问题:
你如何在Android上处理SQLite数据库?
你什么时候去加倍努力,实施ContentProvider和LoaderManager?
你如何保持向后兼容?
我目前的方法:
我创建了一个将数据库I/O(via android.database.sqlite)与活动分开的类.所有方法都会打开和关闭它们在执行期间使用的游标(在我的活动之外),并根据需要返回对象或数据(而不是游标).I/O操作在中执行AsyncTasks.这种方法似乎非常弃用.

这是我在sqlite db中的列的快照,其定义的模式中的数据类型具有DATETIME.现在我想应用一些聚合函数sum()来计算这个列的总和.
我使用的查询是:
select sum(total_expend_time) from timetable; 但它返回0.0作为结果.
我将图像存储在drawable中,并将它们的资源ID存储在SQLite数据库中。我的数据库是在应用程序首次启动时创建的。
将图像ID保存在数据库中是否很好,还是每次应用程序启动时ID都会更改?
如果id更改,则在取回图像id时可能会收到错误。因此,将图像ID存储在数据库中是个好主意吗?
我需要将图像路径与其他相关数据一起存储在数据库中,这就是为什么我将图像ID存储在数据库中的原因。
我正在制作一个使用数据库的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 5E/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
请不要标记此重复项。在发布这个之前,我搜索了很多并且浏览了很多帖子。我在科尔多瓦工作。我有一个 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/。
在哪里可以找到数据库文件?
我是 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) 我想在我的 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 Room 数据库。
我正在尝试通过使用最新版本来安装最新版本的 Sqlite aar
我曾尝试放置aar在我的数据库模块libs文件夹和引用,在我的gradle这个文件但SQLite的版本显示的总是3.22.0
在aar为3.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 兼容的版本,请注意获取代码所涉及的额外步骤。
- 使用预先构建的 aar 文件 这是最直接的选项。“aar”文件类似于 jar 文件,不同之处在于它可能包含已编译的 Java 类和本机代码。此页面提供了可用于 API 级别 16 及更高级别的最新 SQLite 版本的 …
在我的应用程序中,用户可以在每个组合中使用多个过滤器来过滤他们的数据(仅应用一个、多个或不应用)。
在此之前,我只有一个过滤器,所以每次应用它时,我都在切换 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) 这是一个知识共享问题。
我有一个反应本机项目,compileSdkVersion并targetSdkVersion设置为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-sqlite ×10
android ×8
android-room ×4
database ×2
kotlin ×2
cordova ×1
expo ×1
flipper ×1
java ×1
react-native ×1
sealed-class ×1
sqlite ×1