到目前为止,我们已经在android中开发了在运行时创建数据库的应用 我们想知道如何在我们的Android应用程序中访问预先构建的或现有的数据库/ sqlite文件?请提供详细信息
private Cursor getContacts()
{
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
(mShowInvisible ? "0" : "1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
Run Code Online (Sandbox Code Playgroud)
什么COLLATE LOCALIZED ASC代表什么?
是否可以将存储在res/raw资源目录中的csv文件用于填充sqlite3数据库中的表?
我的想法是,如果有一种方法可以将整个文件批量导入到表中,那么比迭代文件中的每一行并执行单独的插入语句更简洁,更快......
我发现有一个sqlite import命令允许这样:如何导入将.sql或.csv文件加载到SQLite中?
...但我在Android应用程序中应用这些语句时遇到了问题.我的第一个想法是尝试类似下面的东西......但没有运气:
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
db.execSQL(".mode csv");
db.execSQL(".import res/raw/MyFile.csv " + TABLE_NAME);
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我应该尝试不同的方法来填充我的数据库吗?
更新:我将Josef的回复标记为答案(使用交易批量插入),因为它工作正常并根据我的标题直接回答我的问题(感谢Josef).但是,我仍在寻找一种方法,使用import语句在csv文件中将Android应用程序批量插入到sqlite3表中.如果你知道怎么做,请回复.
谢谢你的回答!
我正在创建这样的表:
CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)
如何在表foobar中插入或生成id字段的值?
我创建了一个使用SQLite作为本地数据库的Swing应用程序.数据库文件位于项目的根目录中.
Project/DatabaseFile
Run Code Online (Sandbox Code Playgroud)
应用程序在Eclipse上运行良好,但是当我运行打包的可执行文件Jar时,我收到以下错误:
No such table : table1
Run Code Online (Sandbox Code Playgroud)
这意味着无法访问数据库.当我检查生成的JAR文件的内容时,数据库文件不再存在.
在代码中,我将数据库链接如下:
jdbc:sqlite:DatabaseFile
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何将SQLite数据库包含在可执行的Jar中?
编辑
当我将DB文件放在源文件夹中Project/src/DatabaseFile并将路径更改为时jdbc:sqlite:src/DatabaseFile,它在Eclipse上运行,但在运行Jar文件时再次运行java -jar Project.jar.它说:
path to 'src/DatabaseFile': 'C:\Users\name\src' does not exist
Run Code Online (Sandbox Code Playgroud)
我想我需要为数据库指定一个相对路径.
编辑
这是我连接数据库的方式:
public Connection getConnection(){
try{
Class.forName("org.sqlite.JDBC").newInstance();
con = DriverManager.getConnection("jdbc:sqlite:src/DatabaseFile");
} catch (Exception e) {
Log.fatal("Méthode: getConnection() | Class : SQLiteConnection | msg system : " + e.getMessage());
}
return con;
}
Run Code Online (Sandbox Code Playgroud) 我需要在我的Android应用中将数据从一个表移动到另一个表
我想使用以下sql:
insert into MYTABLE2 select id, STATUS risposta, DATETIME('now') data_ins from MYTABLE 2
Run Code Online (Sandbox Code Playgroud)
不幸的是,在表MYTABLE2中有一个_ID列AUTOINCREMENT.我能做什么?
谢谢.
编辑: 这是我的MYTABLE2,我希望用另一个表中的数据填充表格:
CREATE TABLE "ANSWERS" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,
"ID_QUESTION" INTEGER,"DATE_INS" DATETIME DEFAULT
(CURRENT_DATE) , "ANSWER" INTEGER)
Run Code Online (Sandbox Code Playgroud) 我有一个只读数据库连接.有时,当使用SELECT查询从数据库中读取数据时,它会抛出一个SQLiteReadOnlyDatabaseException.
我这样打开连接:
return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
Run Code Online (Sandbox Code Playgroud)
查询是:
Select * FROM BudgetVersions WHERE entityId = ?
Run Code Online (Sandbox Code Playgroud)
我使用数据库读取数据db.rawQuery(),如下所示:
String query = ...;
Cursor c = db.rawQuery(query, new String[]{ activeBudgetId });
try {
if (c.moveToFirst()) {
bv.versionName = c.getString(c.getColumnIndexOrThrow("versionName"));
return bv;
} else {
return null;
}
} finally {
c.close();
}
Run Code Online (Sandbox Code Playgroud)
很少,我在这样的调用中遇到了这样的崩溃c.moveToFirst():
Caused by: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 776)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:845)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144) …Run Code Online (Sandbox Code Playgroud) AUTOINCREMENT做桌子后我可以做一个字段吗?例如,如果您创建一个这样的表:
create table person(id integer primary key, name text);
Run Code Online (Sandbox Code Playgroud)
然后才意识到需要自动增量.我如何修复它,即在MySQL中你可以做到:
alter table person modify column id integer auto_increment
Run Code Online (Sandbox Code Playgroud)
表创建是创建列的唯一机会AUTOINCREMENT吗?
我正在寻找在后台更新相当大的基于核心数据的数据集的最佳方法,尽可能减少对应用程序UI(主线程)的影响.
这个主题有一些很好的材料,包括:
根据我的研究和个人经验,可用的最佳选择是有效地使用两个单独的核心数据堆栈,这些堆栈仅在数据库(SQLite)级别共享数据.这意味着我们需要两个独立的NSPersistentStoreCoordinators,每个都有它自己的NSManagedObjectContext.通过在数据库上启用预写日志记录(默认从iOS 7开始),几乎在所有情况下都可以避免锁定的需要(除非我们有两个或更多同时写入,这在我的场景中不太可能).
为了进行有效的后台更新并节省内存,还需要批量处理数据并定期保存后台上下文,以便将脏对象存储到数据库并从内存中刷新.可以使用此时NSManagedObjectContextDidSaveNotification生成的结果将背景更改合并到主上下文中,但通常您不希望在保存批处理后立即更新UI.您希望等到后台作业完成并刷新UI(在WWDC会话和objc.io文章中都推荐).这实际上意味着应用程序主上下文在特定时间段内与数据库保持不同步.
所有这些都引出了我的主要问题,即,如果我以这种方式更改数据库,而不立即告诉主要上下文合并更改,那会出现什么问题?我假设它不是所有的阳光都是玫瑰.
我脑子里想到的一个特定情况是,如果后台操作在数据库中删除了该对象,那么如果在主上下文中加载的对象需要满足错误会发生什么?例如,这可能发生在基于NSFetchedResultsController的表视图上,该视图使用batchSize逐步将对象提取到内存中吗?即,尚未完全获取的对象被删除,但我们向上滚动到需要加载对象的点.这是一个潜在的问题吗?其他事情可能会出错吗?我对此事的任何意见表示感谢.