私はこのコードを持っています:
-(int)queryUserVersion: (sqlite3*) db {
// get current database version of schema
static sqlite3_stmt *stmt_version;
if(sqlite3_prepare_v2(db, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK) {
while(sqlite3_step(stmt_version) == SQLITE_ROW) {
databaseVersion = sqlite3_column_int(stmt_version, 0);
NSLog(@"%s: version %d", __FUNCTION__, databaseVersion);
}
NSLog(@"%s: the databaseVersion is: %d", __FUNCTION__, databaseVersion);
} else {
NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(db) );
}
sqlite3_finalize(stmt_version);
return databaseVersion;
}
user_version
ユーザーが iPhone Documents ディレクトリに持っているsqlite を確認できます。以前に SQLite DB をダウンロードしました。user_version
ローカル SQLiteがサーバー上にある SQLite と同じ場合、ユーザーがアプリをロードするたびに知りたいですuser_version
。異なる場合は、新しいバージョンをダウンロードします。
user_version
ダウンロードする前に SQLite を確認するにはどうすればよいですか?
アップデート
私はこれについて考えてParse API
いました。アプリのいくつかの機能に を使用しているので、このシステムを使用することにしました:
user_version
sqlite の値を Parse Webservicesに保存して、手動で更新しました。- ダウンロードしたいDBを知るために、iPhoneの言語をローカライズしてチェックします(2つの言語で同じDBを持っています)
- アプリを初めて実行するかどうかを で確認し
NSUserDefaults
ます。 - 初めての場合は、言語をチェックしてから、サーバーから正しい DB をダウンロードします。
- 初めてアプリを実行しない場合は、Parse で現在の user_version を確認し、それを
user_version
iPhone のローカル sqlite データベースと比較します。値が大きい場合は、DB をダウンロードして更新します。
新しい問題:で user_version を確認するときParse
、クエリFindObjectsInBackgroundWithBlock
(非同期) を使用するため、user_version を確認する前にアプリが実行され、DB のダウンロードが行われます。どうすれば対処できますか?NSTimer
私はすでに..で試しました
コード:
-(void)checkUserVersion{
PFQuery *query = [PFQuery queryWithClassName:@"sqliteversion"]; //1
// NSNumber *n=databaseVersion;
[query whereKey:@"user_version" equalTo:[NSNumber numberWithInt:[databaseVersion integerValue]]];//2
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {//4
if (!error && [objects count]>0) {
for (PFObject *object in objects) {
valor1=[[object objectForKey:@"Value"]intValue];
user_version=[NSNumber numberWithInt:valor1];
}
}
}];}