我正在开发一个将在本地从SQLite Db中提取数据的应用程序。该应用程序正在运行文件,但在我测试时,我添加了更多记录等但由于某种原因,模拟器和设备只能看到最后一个副本。
我已经完成了一个CLEAN构建,从项目中删除了.DB,然后将其添加回来,但无济于事。如果数据库有5条记录,我更新/添加另外两条记录,这些新记录没有显示。
关于我能看到它们的唯一方法是从项目中删除.DB,将数据库重命名为另一个名称,然后重新添加。
我知道这听起来像某种类型的缓存问题,但我无法弄清楚如何清除它。正如我所提到的,模拟器和设备都是一样的。
非常感谢任何帮助。提前谢谢。
...地理位置
答案 0 :(得分:0)
听起来像是一个棘手的调试。请问您是如何连接数据库的?您使用的是CoreData还是原始SQL语句?
我很难理解数据库如何与CoreData协同工作,所以我可以提供帮助。
答案 1 :(得分:0)
数据库文件是否是应用程序包的一部分?您无法修改应用程序包。将数据库复制到可以修改它的位置,例如Documents目录,或者在第一次运行时在运行时创建数据库。
答案 2 :(得分:0)
如果资源中有db文件,则需要在启动时将资源从资源复制到库或文档,然后连接到文档或库中的文件。
提示:注销您连接的路径,在终端中打开它(它将在Derived Data下),然后使用sqlite3 cmd行(搜索)进行连接和查询。这有助于保持您在正确的数据库上运行的理智,并且可以随时检查数据。
作为旁注,请参阅这篇文章(如果您有兴趣,我有一个处理所有这些的库): Don't wan't to replacing the old database when app is updated
这是一个示例应用程序中的示例,我调用了ensureOpened(它处理资源中的副本并记录我正在使用的内容):
- (BOOL)ensureDatabaseOpen: (NSError **)error
{
// already created db connection
if (_contactDb != nil)
{
return YES;
}
NSLog(@">> ContactManager::ensureDatabaseOpen");
if (![self ensureDatabasePrepared:error])
{
return NO;
}
const char *dbpath = [_dbPath UTF8String];
if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
error != nil)
{
*error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
return NO;
}
NSLog(@"opened");
return YES;
}
- (BOOL)ensureDatabasePrepared: (NSError **)error
{
// already prepared
if ((_dbPath != nil) &&
([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
{
return YES;
}
// db in main bundle - cant edit. copy to library if !exist
NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
NSLog(@"%@", dbTemplatePath);
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
_dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];
NSLog(@"dbPath: %@", _dbPath);
// copy db from template to library
if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
{
NSLog(@"db not exists");
NSError *error = nil;
if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
{
return NO;
}
NSLog(@"copied");
}
return YES;
}
希望有所帮助