标签: android-sqlite

Android:ContentResolver.update() 究竟做了什么?

我想使用ContentResolver.update(Uri uri, ContentValues values, String where, String[] selectionArgs) 我知道如何使用它的方法,但我想知道它对 ContentValues 做了什么。它是覆盖所有现有的 ContentValues,还是只覆盖给定的 ContentValues?

例如,这些 ContentValues 存在:

A: abc
B: 123
C: 456
Run Code Online (Sandbox Code Playgroud)

update()方法中的 ContentValues包含以下内容:

A: asdf
C: 789
Run Code Online (Sandbox Code Playgroud)

那么新的 ContentValues 将是:(仅覆盖给定的值)

A: asdf
B: 123
C: 789
Run Code Online (Sandbox Code Playgroud)

或者会是:(覆盖所有值)

A: asdf
C: 789
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

 contentResolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values, "_data=" + audioFilePath, null);
Run Code Online (Sandbox Code Playgroud)

其中values包含ContentValues应该被覆盖的 并且audioFilePath包含音频文件的路径(这是 的值_data)。

android android-contentresolver android-sqlite

5
推荐指数
1
解决办法
6437
查看次数

“显式终止方法'关闭'未调用”是什么意思?

03-02 04:23:07.015:E/StrictMode(1096):在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。03-02 04:23:07.015: E/StrictMode(1096): java.lang.Throwable: 未调用显式终止方法“close” 03-02 04:23:07.015: E/StrictMode(1096): 在 dalvik.system .CloseGuard.open(CloseGuard.java:184) 03-02 04:23:07.015: E/StrictMode(1096): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:805) 03-02 04:23 :07.015: E/StrictMode(1096): 在 android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 03-02 04:23:07.015: E/StrictMode(1096): 在 android.database.sqlite。 SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 03-02 04:23:07.015: E/StrictMode(1096): 在 android.app.ContextImpl。

android sqliteopenhelper android-sqlite

5
推荐指数
1
解决办法
7676
查看次数

无法在事务内附加数据库

我正在开发一个必须使用两个数据库的应用程序。我想将新数据库表中的记录添加到旧数据库表中,我已将新数据库放在项目的资产文件夹中,并且可以使用新数据库和旧数据库进行查询。

问题是当我尝试在方法上将新数据库附加到旧数据库时,发生了无法在事务中附加数据库的onUpgrade()错误。

我发现很多链接都有这个问题,我已经尝试了很多但没有成功。我是 Android 新手SQLite,请告诉我如何在代码中附加数据库和另一个数据库。

数据库助手类: DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
Context context;
SQLiteDatabase sourceDatabase;
private String TAG = this.getClass().getSimpleName();

private static final String DATABASE_NAME = "namesdemo_db";
private static final String SOURCE_DB_NAME = "namesdemo_db_s";
private static final int DATABASE_VERSION = 23;

private String DATABASE_PATH;
File dbFile;

// TABLE NAMES
private static final String TABLE_EMPLOYEE = "employee";
private static final String TABLE_FAVORITE = "fevorite";

// KEYS of Table Employee
private static final String KEY_ID …
Run Code Online (Sandbox Code Playgroud)

sqlite android android-sqlite

5
推荐指数
1
解决办法
5579
查看次数

SQLite 和 Room Persistence Library:如何结合 IN 条件和 LIKE?

我在“谷歌搜索”这个时遇到了麻烦,但希望它对专家(甚至中级)来说不是太棘手。

有没有办法在未知数量的多个 OR 条件中搜索子字符串?

Android SQLite Room Persistence DAO 的原始查询是:

SELECT country FROM table WHERE country IN (:searchList)
Run Code Online (Sandbox Code Playgroud)

其中,给定 ['Paris, France', 'Berlin, Germany'] 的 searchList 将转换为 SQL:

SELECT country FROM table WHERE country IN ( 'Paris, France', 'Berlin, Germany' );
Run Code Online (Sandbox Code Playgroud)

并且会返回:['巴黎,法国','柏林,德国']

但是,我希望能够仅按国家/地区进行搜索。例如,给定 ['France', 'Germany'] 的搜索列表,不幸的是我没有得到任何结果。

我知道以下 SQL 可以解决问题:

SELECT country FROM table  WHERE country LIKE '%France%' OR country LIKE '%Germany%';
Run Code Online (Sandbox Code Playgroud)

但是,因为我不知道 searchList 中有多少元素,所以我必须使用原始格式:

SELECT country FROM table WHERE country IN (:searchList)
Run Code Online (Sandbox Code Playgroud)

有什么方法可以使上述搜索国家/地区列中的子字符串?

非常感谢您的帮助,

担

sqlite android android-sqlite android-room

5
推荐指数
1
解决办法
1783
查看次数

SQLiteOpenHelper 单连接与多连接

我对访问SQLiteDatabase. 它应该是一个连接或多个连接才能从多个线程访问。我已经阅读了很多文章,包括以下两篇。

/sf/answers/258291841/ http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

这两者都建议使用单一连接。甚至我自己对同一问题的回答也被 OP 接受了。我使用了Singleton访问SQLiteopenHelper类的方法。

/sf/answers/2475109171/

但是在阅读了enableWriteAheadLogging哪些州的文档后我仍然感到困惑

此方法支持从同一数据库上的多个线程并行执行查询。它通过打开到数据库的多个连接并为每个查询使用不同的数据库连接来实现这一点。数据库日志模式也更改为允许写入与读取同时进行。

现在这是令人困惑的部分。如果我想从多个线程同时访问数据库,我可以Singleton访问SQLiteOpenHelper它,在我的理解中这意味着插入的串行执行,同时同步读取可以无错误地完成。但是上面的文档说,为了同时访问,enableWriteAheadLogging应该调用它返回创建多个连接。这是怎么回事??如果我getWritableDatabase()通过Singleton SQLiteOpenHelper从多个线程调用using来进行插入,这意味着什么?电话会是连续的吗?应该enableWriteAheadLogging叫?

请说清楚。

sqlite multithreading android sqliteopenhelper android-sqlite

5
推荐指数
1
解决办法
1192
查看次数

如何更改 Room DataBase 的默认数据库文件位置?

我在我的应用程序中使用 RoomDB。能够执行 crud 操作。其实我想看看db文件。

getDatabasePath("user.db").getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我db文件所在的目录,保存目录是这样的

 /data/data/com.example.manvish.roomdb/databases/user.db
Run Code Online (Sandbox Code Playgroud)

但即使在命令提示符下使用 sudo ,我仍然无法访问数据目录。现在我想将 DB 文件位置更改为内部存储器或 SD 卡中的其他一些文件夹。我怎样才能做到这一点?

android android-sqlite android-room

5
推荐指数
1
解决办法
8146
查看次数

Android 房间 - 清除 sqlite_sequence 不起作用

以下代码不会将自动增量 ID 重置/清除为 0

database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
            .build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"});
Run Code Online (Sandbox Code Playgroud)

或者

database.query("REPLACE INTO sqlite_sequence (name, seq) VALUES ('mission', -1)", null);
Run Code Online (Sandbox Code Playgroud)

无论如何要清除sqlite_sequenceAndroid房间吗?

我认为,Android 房间没有使用“sqlite_sequence”进行自动递增逻辑,我不确定。尝试打印sqlite_sequence条目,找不到我使用的表名(具有自动递增主键)。

android android-sqlite android-room

5
推荐指数
1
解决办法
791
查看次数

Android Room - 如何在每次运行应用程序时重置自动生成的表主键

我正在使用 Room 来保存数据。
我有一个实体,它有一个模拟票证系统的自动生成(自动生成)主键。 在每个应用程序运行时,我需要这个键从 0 开始。

实体:

@Entity
public class SequenceAction {

    @PrimaryKey(autoGenerate = true)
    private Integer sequenceId;
    private String actionType;
    private String extraInfo;
    //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

初始化:

// init sequenceAction object
// run with executor(sequenceId is automatically set on insert to table):
AppDatabase.getInstance(getContext()).sequenceActionDao().save(sequenceAction);
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情:

我AppDatabase.getInstance(getApplicationContext()).clearAllTables(); 过去常常在退出时清除表,但这不会重置键起始索引,而是从上次运行时停止的位置开始。

我还没有找到使用 Room 执行此操作的方法,因此我正在尝试将 SimpleSQLiteQuery 传递给 Dao 中的 RawQuery 方法:

//Dao
@RawQuery()
Integer init(SimpleSQLiteQuery query);

//Passed query
new SimpleSQLiteQuery("...query...");
Run Code Online (Sandbox Code Playgroud)

我试过下一个查询:

  1. "ALTER TABLE SequenceAction AUTO_INCREMENT = 0"

我收到一个错误(我用“AUTOINCREMENT”试过这个,同样的错误):

android.database.sqlite.SQLiteException:在“AUTO_INCREMENT”附近:语法错误(代码 …

android auto-increment android-sqlite android-room

5
推荐指数
1
解决办法
8356
查看次数

使用房间持久性库插入一对多关系

我有一种情况,我想使用 Room 持久性库将数据插入 Master (store_master) 和 Mapping (store_mapping) 表中的一对多关系。我的实现如下:

@Entity(tableName = "store_master")
class Store {

@PrimaryKey(autoGenerate = true)
public var store_id: Int = 0

@SerializedName("name")
lateinit var store_name: String
}

@Entity(tableName = "store_mapping", foreignKeys = arrayOf(
    ForeignKey(entity = Store::class,
            parentColumns = arrayOf("store_id"),
            childColumns = arrayOf("pic_id"),
            onDelete = CASCADE)))
class StorePicture(@field:PrimaryKey(autoGenerate = true)
          @ColumnInfo(name = "id") var id: Int,
          @SerializedName("pic_id") var pic_id: Int?,
          @SerializedName("image") var storage_picture: String?)

 class StoreWithPictures {
    @Embedded
    var store: Store? = null

    @Relation(parentColumn = "store_id",
        entityColumn = …
Run Code Online (Sandbox Code Playgroud)

android android-sqlite android-room android-architecture-components android-jetpack

5
推荐指数
1
解决办法
2233
查看次数

net.sqlcipher.database.SQLiteException: file is not a database: ,编译时: select count(*) from sqlite_master

错误这一行:

mDataBase = SQLiteDatabase.openDatabase(dbPath, "123", null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Run Code Online (Sandbox Code Playgroud)

打开数据库时。但怎么了?如何用密码打开数据库?谁能帮我?

  1. 我在 SQLITE Db 浏览器 > 文件 > 设置加密上设置密码
  2. 在android部分打开这个密码
  3. 打开时显示错误
  4. error : net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master

任何人都可以帮我解决它吗?提前致谢

import android.content.Context;
import android.database.SQLException;
//import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import net.sqlcipher.database.SQLiteDatabase.CursorFactory;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static String TAG = DatabaseHelper.class.getName(); …
Run Code Online (Sandbox Code Playgroud)

sqlcipher sqliteopenhelper android-sqlite sqlcipher-android

5
推荐指数
1
解决办法
5181
查看次数