根据这个空外键是允许的,除非并且直到我们向模式添加适当的“NOT NULL”约束。
但我看到了一些不同的行为,
sqlite> PRAGMA Foreign_keys;
1
sqlite> create table proc (
sqlite> pid integer,
sqlite> name text,
sqlite> ppid integer,
sqlite> foreign key (ppid) references proc (id)
sqlite> );
sqlite> .schema proc
CREATE TABLE proc (
pid integer,
name text,
ppid integer,
foreign key (ppid) references proc (id)
);
sqlite> insert into proc (pid, name, ppid)
sqlite> values (0, "init", null);
Error: foreign key mismatch
sqlite> PRAGMA Foreign_keys=OFF;
sqlite> PRAGMA Foreign_keys;
0
sqlite> insert into proc (pid, …Run Code Online (Sandbox Code Playgroud) 我想创建一个更新触发器,
我可以在“BEGIN”和“END”之间创建一个变量,并通过 select sql 语句的查询设置值吗?然后通过判断这个变量来执行“if”“else”语句
我是 SQLite 的新手,我读过 SQLite 的序列化模式是线程安全的,并且可以不受限制地由多个线程安全使用。
我的问题是:在单线程应用程序中,与每个数据库操作使用一个连接相比,如果我对所有数据库操作使用一个相同的全局连接,是否会影响性能?(忽略构建数据库连接的性能影响)
具体来说,想象这样一个场景:在同一个线程中,我需要构建两个prepared statement来分别查询同一个dababase中的两个表,我需要交替使用STEP()从两个语句中检索数据。我的问题是哪个会有更好的性能: I. 对两个语句使用相同的连接;二、每个语句一个连接?(不考虑建立连接过程中发生的性能影响)或者是否有必要使用连接池来提高性能?
从表中删除记录时如何解决greenDao中的SQLiteFulException?
这是我的堆栈跟踪:
android.database.sqlite.SQLiteFullException: database or disk is full (code 13)
at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555)
at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437)
at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
at de.greenrobot.dao.AbstractDao.deleteInTxInternal(AbstractDao.java:613)
at de.greenrobot.dao.AbstractDao.deleteInTx(AbstractDao.java:623)
Run Code Online (Sandbox Code Playgroud)
这是我从数据库中删除记录的代码:
QueryBuilder<TaskD> qb = getTaskDDao(context).queryBuilder();
qb.where(TaskDDao.Properties.Uuid_task_h.eq(keyTaskH));
qb.build();
getTaskDDao(context).deleteInTx(qb.list());
getDaoSession(context).clear();
Run Code Online (Sandbox Code Playgroud) 我有一个由 sqlite 表支持的 ContentProvider。所以为了创建我的表,我使用了
\n\npublic class H extends SQLiteOpenHelper {\n @Override\n public void onCreate(SQLiteDatabase sqliteDatabase) {\n \xe2\x80\xa6// here I defined my original table without constraints\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n最初创建时,该表具有以下列:姓名、年龄、身高。没有限制。没有什么。
\n\n现在我需要向表添加约束。所以我增加了 DATABASE_VERSION,然后在 onCreate String 中添加了UNIQUE(name,age) ON CONFLICT REPLACE。\n我的问题是,我应该在方法内部做什么onUpgrade?更简单地说:我如何调用ALTER TABLE仅添加约束?我的尝试失败了
ALTER TABLE myTable ADD UNIQUE(name,age) ON CONFLICT REPLACE\nRun Code Online (Sandbox Code Playgroud)\n\n这是错误消息:
\n\nCaused by: android.database.sqlite.SQLiteException: near "CONSTRAINT": syntax error (code 1): , while compiling: ALTER TABLE myTable ADD CONSTRAINT UNIQUE(name,age) ON CONFLICT REPLACE\n#################################################################\nError Code : …Run Code Online (Sandbox Code Playgroud) 我创建了字段的表map_latitude和map_longitudeSQLite中数据库的数据类型REAL。
但是当我在 Toast Message 中从数据库中检索数据时,我看到它只有零小数点。
例如:
15.31894
store as 15.0
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
这是我第一次使用 Room。我有一个班级叫:
@Entity(tableName = "users")
class User{
@PrimaryKey
@ColumnInfo(name = "id")
@SerializedName("id")
String id;
@ColumnInfo(name = "name")
@SerializedName("name")
String name;
@SerializedName("shift")
@Ignore
List<Shift> shifts;
}
@Entity(tableName = "shifts")
class Shift{
@PrimaryKey
@ColumnInfo(name = "id")
@SerializedName("id")
String id;
@ColumnInfo(name = "start_time")
@SerializedName("start_time")
String startTime;
@ColumnInfo(name = "end_time")
@SerializedName("end_time")
String endTime;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两个是数据库中的单独表,因此我不能使用 @Embedded 注释,因为它将创建一个使用所有字段作为列的表。我也在使用上面的 User 类来存储来自服务器的 json 响应,在那里我在 json 对象中获取用户和转移详细信息。
有什么方法可以在用户表中插入用户详细信息后立即在班次表中插入班次详细信息?我最初认为这将使用 @Embeded 处理,但这会在用户表中创建我不想要的移位表列。
有人可以帮助我了解我应该如何在 Room Persistence Library 中处理这个问题。类似的,我也必须删除。
谢谢
我需要将价格存储在我的房间数据库中。根据使用我的应用程序的国家/地区,我可以拥有 2 位小数或 3 位小数的小数精度。
在使用android的房间库在sqlite数据库中存储float甚至double值时,它会更改值。例如:14.54 存储为 14.539999961853
在调试时,我只能在传递给 insert 的列表中找到值 14.54。但是在从适用于 Windows 的 SQLite 浏览器应用程序中检查保存的记录时。我看到价值观发生了变化。我已经使用 sqlite 浏览器手动输入了一个查询,并且该值按原样保存(浮点值而不改变精度)。例如:
("INSERT INTO MYTABLE (ItemPrice) VALUES (14.54)");
Run Code Online (Sandbox Code Playgroud)
以上查询执行成功,插入14.54的浮点数
但是在android中使用以下
@Insert
Long[] saveMyTable(final List<MYTABLE> myTable);
Run Code Online (Sandbox Code Playgroud)
MyTable 实体有一个字段作为
public float ItemPrice;
Run Code Online (Sandbox Code Playgroud)
插入上述查询时,值已更改
我还尝试将 DB Schema 中的数据类型更改为 real、float、double。但没有任何帮助。
当我试图中断查询以获得更好的可读性/理解性时,它会停止被 IDE 检查。这发生在 Android Studio 3.2 canary 16 和 3.1.2 stable、kotlin 版本 1.2.41 上。
当 Room DAO 是 java 类/接口时,一切正常。是否可以在 kotlin 中对 2+ 行查询进行与 Java 中相同的检查/突出显示?
kotlin android-sqlite android-studio android-room android-architecture-components
目前,我们有以下 Dao 和模型类。
@Query("SELECT * FROM note")
public abstract LiveData<List<Note>> getAllNotes();
Run Code Online (Sandbox Code Playgroud)
@Entity(
tableName = "note"
)
public class Note {
@ColumnInfo(name = "title")
private String title;
// Can contain a huge String.
@ColumnInfo(name = "body")
private String body;
}
Run Code Online (Sandbox Code Playgroud)
但是,在某些情况下,我们只对加载感兴趣title。
一次加载所有Note带有大body字符串的s ,可能会导致OutOfMemoryException
有什么办法,我们可以创建另一个 POJO 如下?
public class SimpleNote {
private String title;
}
Run Code Online (Sandbox Code Playgroud)
然后,我们可以返回SimpleNotefrom 的列表NoteDao?
@Query("???")
public abstract LiveData<List<SimpleNote>> getAllSimpleNotes();
Run Code Online (Sandbox Code Playgroud) android-sqlite ×10
sqlite ×7
android ×5
android-room ×4
android-architecture-components ×1
datatrigger ×1
greendao ×1
kotlin ×1