我的应用在.sqlite文件中有3,000个考题。这些问题是根据用户的需求动态选择和排序的(例如,“按错误答案排序”,“仅选择未访问的问题”)。
每当用户做出选择时,app会生成相应的SQL语句,并且通过使用sqlite3,所有结果集都会被发送到NSMutableArray(Question类)。但正如您将注意到的,这是一个耗时的过程(大约2~3秒,UI停止响应)。
所以我想创建一个'cursor'类,它有rowCount()和moveToRow(int index)方法。
有了这个,我的想法是
Cursor c = [[Cursor alloc] init] query(
"SELECT id,qtext,answer,a1,a2,... FROM TABLE WHERE id > 100"
)];
// at this time, just a cursor is given, no need to iterate all the retrieved rows
for (i=0; i > c.rowCount(); i++) {
c.moveToRow(i);
ShowQuestionDetail(c);
}
喜欢这个。
我知道CoreData符合此目的,但我需要与此应用的Android版本共享.sqlite文件。 CoreData要求所有表名和字段名以Z_前缀开头,但我无法修改.sqlite文件的方案。此外,我需要使用sqlcipher,而CoreData不能与sqlcipher一起使用。
FMDB不支持提供已检索行数并移动到特定行的方法。
是否还有其他支持此功能的SQLite包装器库?
有人建议制作一个'catalog'数组,它只包含检索到的行的id,并在每次调用moveToRow()时获取行。我同意这是一个很好的选择,但我想找到另一种方式。
答案 0 :(得分:1)
另一种方法可能是将查询限制为1行数据。那就是在cellForRowAtIndex进行调用。根据我的经验 - 最好有一个单独的方法 - 如果你真的需要,你甚至可以更进一步,根据coredata添加一个DataCache层用于缓存到内存。
像这样...... http://code.google.com/p/airband/source/browse/trunk/airband/Classes/DataCache.h?spec=svn103&r=103
EG。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //初始化你的手机
NSDictionary *dict = [self questionDataForCellAtIndexPath:indexPath];
// set the cell values
}
-(NSDictionary*)questionDataForCellAtIndexPath:(NSIndexPath *)indexPath{
//ENTER_METHOD;
NSDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:0];
NSString *qry = [NSString stringWithFormat: @"SELECT id,qtext,answer,a1,a2,... FROM TABLE WHERE id ORDER BY id DESC limit 1 offset %d", [indexPath row]];
// you could look up here for previously accessed rows from DataCache
// NSDictionary *cachedRow = [DATAENV.cache objectForKey:num];
///if (cachedRow == nil) {
// go get it
// else return it
DLog(@"qry%@",qry );
EGODatabaseResult *result = [appDelegate.userdb executeQuery:qry];
if ([result count]==0) {
return dict;
}
for(EGODatabaseRow *row in result) {
[dict setValue:[row stringForColumn:@"name"] forKey:@"name"];
}
return dict;
}
查看我的前叉以获取EgoDatabase。 https://github.com/jdp-global/egodatabase
它还包括非阻塞的异步方法。