标签: sqlite

增加android/sqlite数据库中记录的值

我尝试在表中的行中增加整数键的值.然而,似乎没有任何事情发生.

db.rawQuery("UPDATE table SET key = key + 1 WHERE name=?", new String[] {name});
Run Code Online (Sandbox Code Playgroud)

但是,此代码工作正常(只需将密钥设置为硬编码值):

    ContentValues values = new ContentValues();
    values.put("key", 2);
    db.update("table", values, "name=?", new String[] {name});
Run Code Online (Sandbox Code Playgroud)

还试过'?' 而不只是?,但它只是导致运行时错误.

sqlite android

18
推荐指数
1
解决办法
9143
查看次数

SQLite多对多的关系?

我正在尝试使用foos和bars 建立一个SQLite3数据库,并在它们之间建立多对多关系.这是我到目前为止所得到的:

CREATE TABLE foo(
    id INTEGER PRIMARY KEY NOT NULL,
    foo_col INTEGER NOT NULL
);
CREATE TABLE bar(
    id INTEGER PRIMARY KEY NOT NULL,
    bar_col TEXT NOT NULL
);
CREATE TABLE foobar(
    foo_id INTEGER,
    bar_id INTEGER,
    FOREIGN KEY(foo_id) REFERENCES foo(id) ON DELETE CASCADE,
    FOREIGN KEY(bar_id) REFERENCES bar(id) ON DELETE CASCADE
);
CREATE INDEX fooindex ON foobar(foo_id);
CREATE INDEX tagindex ON foobar(tag_id);
Run Code Online (Sandbox Code Playgroud)

......但它似乎没有起作用.我可以删除一行foo,但不会影响foobar.我究竟做错了什么?

sqlite many-to-many relational-database

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

你知道任何SQLite视觉开发工具吗?

您是否知道任何可视化开发工具,如Microsoft Access或FileMaker,但使用SQlite作为数据库引擎?

我正在寻找一种Windows桌面软件(或简单的编程语言),我可以用它构建一个使用SQLite的数据库应用程序.

谢谢.

sqlite

18
推荐指数
2
解决办法
3万
查看次数

如何在SQLite中获取最后一个插入ID?

SQLite中是否有可用的内置函数来获取最后插入的行id.例如: - 在mysql中我们有LAST_INSERT_ID()这种功能.对于sqllite,任何可用于执行相同过程的函数.

请帮我.

谢谢

php sql sqlite function lastinsertid

18
推荐指数
3
解决办法
4万
查看次数

如何从sqlite游标中获取列值?

我试图从游标中获取列值,此列是在运行时通过查询内部的计算生成的,我得到此列的空值,我能够获得SQLite表中存在的所有其他列的值.

我在SQLite编辑器上执行相同的查询,它还显示结果集中生成的列的值.

当我从游标中检索它时,为什么这会给出null值?

sqlite android cursor

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

SQLite连接中的新行字符\n

我知道,在某些编程语言中,如果您执行以下操作:

'This is on first line \n This is on second line'
Run Code Online (Sandbox Code Playgroud)

然后它会像这样正确显示:

This is on first line
This is on second line
Run Code Online (Sandbox Code Playgroud)

当我在SQLite数据库中连接一个字符串时

SELECT *, [FIELD1] || '\n'  || [FIELD2] from TABLE
Run Code Online (Sandbox Code Playgroud)

(其中[FIELD1] =这是在第一行[FIELD2] =这是在第二行)

它显示如下:

This is on first line \n This is on second line
Run Code Online (Sandbox Code Playgroud)

有没有理由不正确显示\n字符?

sqlite newline

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

如何保证主机应用程序和扩展程序使用的共享应用程序容器中的Core Data存储中的唯一条目?

为了有效地提出我的问题,我们首先考虑一下我面临的确切情况:

常规设置

  • 主机iOS 8应用程序.
  • 与主机应用程序捆绑在一起的一个或多个iOS 8扩展(WatchKit,Share等).
  • 主机应用程序和所有扩展程序在共享应用程序组容器中共享相同的Core Data SQLite存储.
  • 每个app/extension都有自己的NSPersistentStoreCoordinator和NSManagedObjectContext.
  • 每个持久性存储协调器使用持久性存储,该存储在组容器中与所有其他持久性存储共享相同的SQLite资源.
  • 应用程序和所有扩展使用公共代码库来同步Internet上远程API资源的内容.

导致问题的事件顺序

  1. 用户启动主机应用程序.它开始从远程API资源获取数据.核心数据模型对象基于API响应创建,并"upserted"到主机应用程序的托管对象上下文中.每个API实体都有一个uniqueID,用于在远程API后端中标识它.通过"upsert",我的意思是,对于每个API实体,主机应用程序仅在无法找到给定唯一ID的现有条目时在Core Data中创建新条目.

  2. 同时,用户还启动了一个主机应用程序的扩展.它也可以从同一个远程API执行某种提取.它还尝试在解析API响应时执行"upsert".

  3. 问题:如果主机应用程序和扩展程序同时尝试为同一API实体插入Core Data条目,会发生什么?要了解这是如何产生的,让我们看看upsert的事件序列:

核心数据Upsert序列:

  1. API解析代码解析给定API实体的uniqueID.
  2. 解析器为与谓词匹配的任何条目执行核心数据提取,其中谓词uniqueID等于已解析的唯一ID.
  3. 如果找不到现有条目,则解析器会为此API实体插入新的Core Data条目,将其uniqueID属性设置为已解析的uniqueID.
  4. 解析器保存托管对象上下文,该上下文将新条目数据下推到SQLite后备存储.

问题详情

假设主机应用程序和扩展程序同时独立地解析同一API实体的API响应.如果主机应用程序和扩展程序在它们中的任何一个完成步骤4之前到达步骤3,则它们都将尝试为相同的唯一ID插入新的核心数据条目.当他们到达步骤4并调用save:他们各自的托管对象上下文时,Core Data将很乐意创建重复的条目.

据我所知,Core Data没有任何方法可以将属性标记为唯一.我需要一个等同于SQLite INSERT OR IGNORE+ UPDATE组合的核心数据..或者我需要一种方法来"锁定"持久存储的SQLite后备存储,这听起来像是一个麻烦的方法.

对iOS 8扩展引入的这个相当新颖的问题有一个已知的方法吗?

sqlite core-data ios watchkit ios-extensions

18
推荐指数
2
解决办法
3032
查看次数

JSON extract\set的SQLite JSON1示例

SQLite现在有一个实验性的JSON1扩展来使用JSON字段.可供选择的函数看起来很有前途,但我不知道如何在查询的上下文中使用它们.

假设我创建了下表:

sqlite> create table user(name,phone);
sqlite> insert into user values('oz', json_array(['+491765','+498973']));
Run Code Online (Sandbox Code Playgroud)

该文档显示了如何json_each在查询中使用,但所有其他函数在上下文文档中缺少一些.

具有SQLite经验的人可以提供一些如何使用的示例:

  • json_extract
  • json_set

sqlite json sqlite-json1

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

Sugar ORM不会创建表

我正在开发一个独立的库项目,需要持久化一个简单的模型.这是我的SugarRecord样子:

/**
 *  Keeping track of previously received messages by ID
 */

public class MessageRequestIdModel extends SugarRecord {

    protected String messageRequestId;

    public MessageRequestIdModel() {

    }

    public MessageRequestIdModel(String messageRequestId) {
        this.messageRequestId = messageRequestId;
    }

    public String getMessageRequestId() {
        return this.messageRequestId;
    }

    public static boolean exists(String id) {
        return MessageRequestIdModel.find(
                MessageRequestIdModel.class,
                "messageRequestId = ?",
                id
        ).size() != 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

在存储库类中,我试图通过调用此方法来持久化它:

@Override
public void save(MessageRequestId messageRequestId) {
    new MessageRequestIdModel(messageRequestId.getId()).save();
}
Run Code Online (Sandbox Code Playgroud)

我现在尝试通过使用android.test.InstrumentationTestCase我传递Context给Sugar 的地方来测试它,如下所示:

SugarContext.init(getInstrumentation().getContext());
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,这会导致此错误:(截断以使此问题简洁易读)

android.database.sqlite.SQLiteException: no …
Run Code Online (Sandbox Code Playgroud)

sqlite android android-testing android-sqlite sugarorm

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

sqlite3_open_v2在Windows上占用超过60秒的已知原因?

我将从TL开始; DR版本,因为这可能足够你们中的一些人:

  • 我们正在尝试调查我们在C++产品的诊断数据中看到的问题.
  • 该问题被确定为由超时引起的sqlite3_open_v2,据说超时完成需要60多秒(我们只给它60s).
  • 我们尝试了多种不同的配置,但从来没有能够在这次通话中重现5秒的延迟.

所以问题是,是否有一些已知的场景sqlite3_open_v2可以花费那么长时间(在Windows上)?

现在详细说明:

  • 我们正在使用3.10.2SQLite 版本.我们通过从这个版本更新日志现在去钱柜,没有什么我们已经发现的错误修正节似乎表明,有一些问题,这是在连续的sqlite的版本解决,并可能导致我们的问题.
  • 我们看到的问题影响了所有支持的Windows版本(Win 7,Win 8,Win 10)中约0.1%的唯一用户.没有手动用户抱怨/报告 - 这可能表明问题发生在用户机器/系统发生严重问题的情况下,他不希望任何工作.因此,只要0.1%的随机窗口用户可能发生这种情况,就表明系统失败是一种有效的可能性.
  • 没有数据表明在Mac上发生了同样的问题,这也是支持平台,具有足够大的诊断数据样本.
  • 我们使用Poco(https://github.com/pocoproject/poco,版本:1.7.2)作为访问我们的SQLite数据库的工具,但我们已经分析了Poco代码,似乎这个代码级别的失败可以仅(可能)解释所有收集样品的~1%.这就是我们如何确定问题在于sqlite3_open_v2花费很长时间.
  • 这既发生在DELETE日志模式上也发生在WAL.
  • 似乎在第一次为特定用户发生此问题后,每次连续调用sqlite3_open_v2都会花费很长时间,直到用户重新启动整个应用程序(可能是机器,无法从我们的数据中判断).
  • 我们正在使用以下标志设置sqlite3_open_v2(如在Poco中):

sqlite3_open_v2(..., ..., SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI, NULL);

  • 这通常不会在应用程序启动时发生,因此不太可能是由于我们的应用程序未运行时发生的事情引起的.这包括导致数据破坏的电源中断(无论如何都倾向于返回SQLITE_CORRUPT,如下所述:https://www.sqlite.org/howtocorrupt.html).
  • 即使我们尝试了不同的事情,我们也无法在本地重现此问题:

    • 多个线程从DB写入和读取,具有特定日记系统所需的同步.
    • 保持sqlite连接长时间打开并正常工作db.
    • 试图与其他数据(来自不同的进程倾倒的/ dev /兰特(WSL)将多个文件,同时访问DB正常)硬击HDD.
    • 试图强制防病毒软件在每次访问文件时扫描数据库(使用Avast进行测试,基本上所有功能都已启用,包括"扫描打开"和"扫描写入").
    • 打破特定日记系统所需的内部同步.
    • 使用db文件上的所有可能的文件共享选项组合调用WinAPI CreateFile - 这会导致问题但sqlite3_open_v2总是快速返回 - 只是出错.
    • 在btw的DB文件的随机部分上调用WinAPI LockFile.很好的再现方式SQLITE_IOERR,但没有运气再现讨论的问题.
    • 一些额外的尝试实际拉伸Poco层并仔细检查我们的代码静态分析是否正确.
  • 我们试图在网上寻找类似的问题,但我们发现的任何相关内容都在http://sqlite.1065341.n5.nabble.com/sqlite3-open-v2-performance-degrades-as-number-of- opens-increase-td37482.html.这似乎并不能解释我们的情况,因为并行连接的数量超出了我们的范围以及典型的Windows用户所拥有的数量(除非有一些有点流行的应用程序正在利用我们不知道的sqlite) .

  • 这个问题不太可能是由于数据库是通过网络共享访问的,因为我们将db文件放在里面%appdata%,除非有一些非常标准的Windows配置设置 …

sqlite poco

18
推荐指数
0
解决办法
206
查看次数