我想创建一个简单的 iOS 应用。这个应用程序从 URL 下载一个简单的 SQlite 数据库。
但是当数据库下载并存储在 Documents 文件夹中时,我无法通过一些 SQLite 管理器打开它,因为它说它是加密的,尽管原始数据库不是。
读取这个数据库的代码也不能正常工作,我认为是因为数据库在 Documents 文件夹中加密。这是我到目前为止所得到的。
-(void) downloadDatabase {
NSString *stringURL = @"https://www.dropbox.com/s/cq8y6x29e6ku65r/database.sqlite";
NSURL *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData != nil )
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat"%@/%@", documentsDirectory,@"database.sqlite"];
[urlData writeToFile:filePath atomically:YES];
NSLog(@"Stahujem databazu do: %@", filePath);
}
}
这就是我在应用程序中下载数据库的方式。
// Get the documents directory
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = dirPaths[0];
// Build the path to the database file
NSString *databasePath = [[NSString alloc]
initWithString: [docsDir stringByAppendingPathComponent:
@"database.sqlite"]];
const char *dbpath = [databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &myDatabase) == SQLITE_OK)
{
NSString *querySQL = @"SELECT * FROM CHAMPIONS";
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(myDatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
[list removeAllObjects];
while (sqlite3_step(statement) == SQLITE_ROW)
{
NSString *text = [[NSString alloc]
initWithUTF8String:
(const char *) sqlite3_column_text(
statement, 1)];
[list addObject:text];
statusOfGettingDataFromDB = @"Found!";
NSLog(@"count: %d", [list count]);
}
sqlite3_finalize(statement);
}
sqlite3_close(myDatabase);
}
通过这段代码,我试图从数据库中获取一些数据。但是在 sqlite3_prepare_v2 之后它会直接跳到最后。
你能告诉我一些我做错了什么吗?并建议我如何解决这个问题?
我真的很感激。谢谢。
Best Answer-推荐答案 strong>
您正在下载的 URL 当前返回的是 HTML 页面,而不是 SQLite 文件。
因此,您写入文档目录的 .sqlite 文件无效。如果您修改 URL,您的代码将正常工作
尝试使用此 URL,这是单击 Dropbox 页面上的“下载”按钮时点击的实际 URL。
https://dl.dropboxusercontent.com/s/cq8y6x29e6ku65r/database.sqlite?token_hash=AAH9fdYQzZ6zj8CzhKVBGMi4LcaCRCHNKIlw88wLLskRWQ&dl=1
我尝试了您的代码并打印了从 sqlite db 获取的 list 数组,这是我在日志中得到的结果,
(
Ahri,
Aatrox
)
希望有帮助!
关于ios - iOS 应用程序中的 SQlite 数据库在下载后被加密,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/18378281/
|