标签: sqlite

两个进程可以同时访问内存(:memory :) sqlite数据库吗?

是否可以在一个进程中访问数据库,在另一个进程中创建?我试过了:

空闲#1

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("create table test(testcolumn)")
c.execute("insert into test values('helloooo')")
conn.commit()
conn.close()
Run Code Online (Sandbox Code Playgroud)

IDLE#2

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("select * from test")
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    q = c.execute("select * from test")
sqlite3.OperationalError: no such table: test
Run Code Online (Sandbox Code Playgroud)

python sqlite

15
推荐指数
2
解决办法
7280
查看次数

beginTransaction(),endTransaction()和setTransactionSuccessful().他们究竟做了什么?

从数据库插入,查询,更新和删除项目时,我必须提供同步.据我所知beginTransaction(),这beginTransactionNonExclusive()是我需要的方法.

除了SQLite的文档描述EXCLUSIVE,IMMEDIATE以及DEFERRED相当不错.

交易可以是延期交货,即时交易或独家交易.延迟意味着在首次访问数据库之前,不会在数据库上获取锁.

如果事务是立即的,则只要执行BEGIN命令就会在所有数据库上获取RESERVED锁,而无需等待数据库的使用.在BEGIN IMMEDIATE之后,没有其他数据库连接可以写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE.但是,其他进程可以继续从数据库中读取.

独占事务导致在所有数据库上获取EXCLUSIVE锁.在BEGIN EXCLUSIVE之后,除了read_uncommitted连接之外,没有其他数据库连接能够读取数据库,没有异常的其他连接将无法写入数据库,直到事务完成.

当某些线程正在使用数据库时,它似乎提供了一些保护,防止不必要的插入和查询.但我不确定它是否能保证同步.

insert我的方法ContentProvider.

@Override
public Uri insert(Uri baseUri, ContentValues values) {
    try {
        mDatabase = mHelper.getWritableDatabase();
        mDatabase.beginTransaction(); // EXCLUSIVE
        switch (sUriMatcher.match(baseUri)) {
        case UriCodes.COUNTRIES:
        case UriCodes.CONTINENTS:
        case UriCodes.ORGS:
            String table = baseUri.getLastPathSegment();
            long rowId = mDatabase.insert(table, null, values);
            Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId));
            mDatabase.setTransactionSuccessful();
            return uri;

        default:
            mDatabase.endTransaction();
            throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri);
        } …
Run Code Online (Sandbox Code Playgroud)

sqlite android transactions

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

在SQLite中更改表的主键

我有下表:

[id,lang,data]
Run Code Online (Sandbox Code Playgroud)

主键是哪里 id

我想更改主键, id,lang而不会丢失表的内容.我必须运行哪些查询才能更改它

谢谢

sql sqlite android

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

在iOS上使用和访问现有的SQLite数据库

我在SQLite中有一个完全填充的数据库,我想在我的新应用程序中使用它.它相当大,所以我希望尽可能避免将其更改为其他格式.我如何以与我的应用程序一起提供的方式使用此数据库?

编辑:例如,如果我只是将文件放入我的受支持文件目录,我该如何访问它?我该如何参考?

sqlite objective-c ios swift

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

SQLite - 选择一列的DISTINCT并获取其他列

我有一个这样的表(但有更多列):

Code    Quantity         
-----   --------       
00001      1           
00002      1           
00002      1           
00002      2           
00003      2          
00003      1          
Run Code Online (Sandbox Code Playgroud)

我希望得到与SELECT DISTINCT Code FROM table(00001,00002,00003)相同的结果,但是与所有其他表列相同.

更新:如果我执行此操作:SELECT DISTINCT Code, Quantity from table 我得到:

    Code    Quantity         
    -----   --------       
    00001      1           
    00002      1           
    00002      2           
    00003      1          
    00003      2  
Run Code Online (Sandbox Code Playgroud)

我想得到:

    Code    Quantity         
    -----   --------       
    00001      1           
    00002      1                   
    00003      1 
Run Code Online (Sandbox Code Playgroud)

提前致谢!

sqlite select distinct ios

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

无法分配CursorWindow

我在我的Android应用程序中运行SQLite3数据库.我刚刚从预先填充的数据库中读取了200k行和14列.参赛作品是单词.所有列的数据类型都是文本.查询最多11个字母的单词(例如,ABANDONMENT)工作正常.但对于12或更高(例如,ABANDONMENTS),应用程序崩溃.这是logcat:

Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12.
threadid=11: thread exiting with uncaught exception (group=0x40adf9f0)
FATAL EXCEPTION: Thread-2883
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
at com.example.myapp.MainActivity.query(MainActivity.java:815)
at com.example.myapp.MainActivity$2.run(MainActivity.java:356)
at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)

码:

query = "select * from words where col_1 = \"" + (myWord)+ "\";";
cursor = database.rawQuery(query, null);
if (cursor …
Run Code Online (Sandbox Code Playgroud)

sql database sqlite android cursor

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

SQlite concat select语句

我想知道是否可以在SQlite中连接并添加空格.这就是我的意思:

SELECT NAME || SURNAME AS USER_NAME FROM USERS
Run Code Online (Sandbox Code Playgroud)

但是然后在查询中添加一些东西,让结果显示为:

Name Surname
Run Code Online (Sandbox Code Playgroud)

并不是

NameSurname
Run Code Online (Sandbox Code Playgroud)

在SQlite中这样的事情可能吗?

sqlite select

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

使用SQLite3 + Node.js的最佳实践

我有一个适度的Node.js脚本,它通过API从维基百科中提取数据并将其存储在SQLite数据库中.我正在使用这个node-sqlite3模块.

在某些情况下,我正在下载600,000篇文章的数据,并在数据库中连续存储关于每一篇文章的一些元数据.这些文章是从API中以500个为一组进行检索的.

使用500篇文章中的数据检索JSON对象的请求将对象传递给此回调:

//(db already instantiated as 'new sqlite.Database("wikipedia.sqlite");')

function callback(articles) {
    articles.forEach(function(article) {
        db.run("INSERT OR IGNORE INTO articles (name, id, created) VALUES (?,?,?)", [article["title"], article["pageid"], article["timestamp"]]);
    });
}
Run Code Online (Sandbox Code Playgroud)

这些模块默认并行运行,但node-sqlite3的文档包含一个串行操作示例,如下所示:

db.serialize(function() {
  db.run("CREATE TABLE lorem (info TEXT)");

  var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
  for (var i = 0; i < 10; i++) {
    stmt.run("Ipsum " + i);
  }
  stmt.finalize();
}
Run Code Online (Sandbox Code Playgroud)

我试图模仿这个,看到几乎没有性能差异.我做错了吗?现在,数据从API检索的速度比写入数据库的速度快得多,尽管速度并不慢.但是用600K个别INSERT命令击败数据库感觉很笨拙.

更新:每个接受的答案,这似乎适用于node-sqlite3,而不是本机解决方案.(见本期).

    db.run("BEGIN TRANSACTION");
function callback(articles) {
        articles.forEach(function(article) {
            db.run("INSERT OR …
Run Code Online (Sandbox Code Playgroud)

sqlite node.js

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

用android设备实现Microsoft同步框架

我需要用我的Android应用程序实现Microsoft同步框架.我从这里接受了帮助

使用Microsoft Sync Framework工具包的Android示例.

更新链接:SyncFrameworkAndroid

但我还是不明白工作流程.
任何人都知道如何将Microsoft同步框架与Android应用程序集成以将sqlite db同步到SQL服务器.

sql-server sqlite android microsoft-sync-framework

15
推荐指数
1
解决办法
1664
查看次数

为什么我们在使用string.Format来编写sql语句的同时执行SQLiteCommand,Parameters.add?

我在许多教程中看到,通过使用变量和Parameters.Add来构造sql语句

public void updateStudent(String @studentID, String @firstName, String @lastName)
{
    SQLiteCommand command = conn.CreateCommand();
    command.CommandText = "UPDATE Students SET firstName = @firstName, lastName = @lastName WHERE studentID = @studentID";
    command.Parameters.Add(new SQLiteParameter("@studentID", @studentID));
    command.Parameters.Add(new SQLiteParameter("@firstName", @firstName));
    command.Parameters.Add(new SQLiteParameter("@lastName" , @lastName));
    command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

我们为什么不用

string.Format("Update Students SET firstName = '{0}', lastName = '{1}...", @firstName, @lastname)
Run Code Online (Sandbox Code Playgroud)

任何好处?

c# sqlite

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