2015-05-21 10 views
0

Настройка базы данных SQLITE3 как постоянного хранилища в приложении. Мне нужно проверить, существует ли объект базы данных, заполненный таблицами, и выполнить оператор SQL DDL, если таблицы не присутствуют (т. Е. При первом запуске APP), задаваясь вопросом, лучший ли подход к этому - это то, что у меня ниже или это совершенно неправильно /Есть ли способ лучше?! Могу ли я просто проверить свойство базы данных на то, что оно равно null/nil после int ri = sqlite3_open_v2 ("schoolDatabase.db", & _database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); или вернет ли это значение, даже если в базе данных нет таблиц?Проверка наличия базы данных SQLite3

@interface DBAccess() 
@property (nonatomic,strong) sqlite3 *database; 

@implementation DBAccess 
@synthesize database = _database 

-(id)init 

int check =sqlite3_initialise(); 
if(check==SQLITE_OK){ 
int ri = sqlite3_open_v2("schoolDatabase.db",&_database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,NULL); 
if(ri==SQLITE_OK){ 
NSLOG(@"Database created successfully}; 
else{ NSLog(@"problem creating database");} 

sqlite3_stmt *statement; 
const char *databaseExistence = "SELECT name FROM sqlite_master WHERE Type = table"; 
sqlite3_prepare_v2(self.database,databseExistence,-1,&statement,NULL); 

while(sqlite3_step(statement)==SQLITE_ROW) 
{ 
    //I am presuming column indexes are zero based in sqlite3 ? 
    const unsigned char *tableNames = sqlite3_column_text(statement,2); 
if(tableNames=nil){ 
NSLog(@"Tables in database do not exist......creating tables" 
//insert SQL statement to prepare and execute CREATE TABLE commands for the Blank database 
+0

Ваш текущий запрос, вероятно, лучший способ. – Newyork167

ответ

1

Вы можете проверить application_id и/или user_version прагмами.

Если они равны нулю, то вы открыли новую базу данных и можете настроить свою схему (а также установить их на свои магические числа). Если они соответствуют вашим магическим номерам, то база данных существовала. Если они отличные от нуля, но не совпадают, кто-то их сменил, и вы можете ошибиться на ранней стадии.