2013-03-28 2 views
0

Я скопировал базу данных sqlite, предварительно заполненную из пакета, в путь библиотеки. Теперь, когда я пытаюсь выполнить запрос, он не читает базу данных.Я не могу прочитать мою ранее существовавшую базу данных sqlite

Код для копирования базы данных:

-(void)createDatabase 
{ 
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *targetPath = [libraryPath stringByAppendingPathComponent:@"gre.db"]; 


    if (![[NSFileManager defaultManager] fileExistsAtPath:targetPath]) { 
     // database doesn't exist in your library path... copy it from the bundle 
     NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"gre.db"]; 
     NSError *error = nil; 

     if (![[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:targetPath error:&error]) { 
      NSLog(@"Error: %@", error); 
     } 
    } 
} 

Я называю это из моих applicationDidFinishLaunchLaunchingWithOptions и база данных копируется

Это мой запрос, чтобы прочитать базу данных:

-(void)readDatabase 
{ 
    wordlist = [[NSMutableArray alloc] init]; 
    NSString *query =[NSString stringWithFormat:@"SELECT word FROM words WHERE word LIKE '%@%%'",selectedWord]; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(database, [query UTF8String],-1, &statement, nil) == SQLITE_OK) 
    { 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      char *id1 = (char *)sqlite3_column_text(statement, 0); 
      [wordlist addObject:[NSString stringWithFormat:@"%s",id1]]; 
     } 
    } 
    sqlite3_finalize(statement); 

    NSLog(@"%@",wordlist); 

} 

Теперь управление не входит в цикл *while (sqlite3_step(statement) == SQLITE_ROW)* Следовательно, данные не отображаются.

+0

В базе данных DocumentDirectory пусто? – Yashesh

+0

Вы пытались вытащить данные с устройства (или посмотреть на него в симуляторе), чтобы проверить, действительно ли содержимое было скопировано? – gaige

+0

№. База данных правильно скопирована в путь к библиотеке. Но он не вводит .... while (sqlite3_step (statement) == SQLITE_ROW)! – Chiran

ответ

0

Используйте этот код и убедитесь, что база данных подключена и открыта правильно, прежде чем извлекать данные из этого. Надеюсь, это поможет.

-(void)readDatabase 
    { 
     // Set path 
     NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//(customize the path based on ur database location) 

     NSString *docsDir = [dirPaths objectAtIndex:0]; 

     NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"database.db"]]; 
    const char *dbpath = [databasePath UTF8String]; 


     //Checking connection 
     if (sqlite3_open(dbpath, &SQLitedatabase) == SQLITE_OK) 
       { 
       wordlist = [[NSMutableArray alloc] init]; 
       NSString *query =[NSString stringWithFormat:@"SELECT word FROM words WHERE word LIKE '%@%%'",selectedWord]; 
       sqlite3_stmt *statement; 
       if (sqlite3_prepare_v2(database, [query UTF8String],-1, &statement, nil) == SQLITE_OK) 
       { 
       while (sqlite3_step(statement) == SQLITE_ROW) 
       { 
       char *id1 = (char *)sqlite3_column_text(statement, 0); 
       [wordlist addObject:[NSString stringWithFormat:@"%s",id1]]; 
       } 
       } 
       sqlite3_finalize(statement); 

       } 
       } 
    } 

И Убедитесь, что инициализация БД также, как это ...

#import <sqlite3.h> 

NSString *databasePath; 

sqlite3 *SQLiteDataBaseDB; 

@implementation DatabaseManager 
+(void)initializeDb 
{ 
    NSString *docsDir; 
    NSArray *dirPaths; 

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    docsDir = [dirPaths objectAtIndex:0]; 

    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"database.db"]]; 

    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if ([filemgr fileExistsAtPath: databasePath ] == NO) 
    { 
     const char *dbpath = [databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &SQLiteDataBaseDB) == SQLITE_OK) 
     { 
      char *errMsg; 
      //SELECT name FROM sqlite_master WHERE name=USER_VIDEO_INFO 

      const char *sql_stmt = "CREATE TABLE IF NOT EXISTS USER_VIDEO_INFO (userIdentifier TEXT, managerName TEXT, videoPath TEXT, videoName TEXT, shotDate TEXT, session TEXT, videoCategory TEXT)"; 

      if (sqlite3_exec(SQLiteDataBaseDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
      { 
       NSLog(@"Failed to create table"); 
      } 

      sqlite3_close(SQLiteDataBaseDB); 

     } 
     else 
     { 
      NSLog(@"Failed to open/create database"); 
     } 

      } 

} 

И проверить физически БД создается или не нравится ...

enter image description here

+0

Привет Большое спасибо Ganapathy, ваш код работает отлично! – Chiran

+0

Но в моем случае мне не нужно инициализировать правильно ?! Я использую уже существующую базу данных sqlite. – Chiran

0

Если файл базы данных находится в каталоге ресурсов, попробуйте ввести код ниже:

-(NSString*)databasePath 
{ 
    NSString *dbPath = [[NSBundle mainBundle] pathForResource:"gre" forType:"db"]; 
    return dbPath; 
} 

На самом деле вы получаете неправильный путь для своей БД.

0

Вы можете проверить следующий код. Он отлично работает для меня.

if (userDB == NULL) { 
     sqlite3 *newDBconnection; 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory stringByAppendingPathComponent:@"gre.sqlite"]; 

     // Check if the SQL database has already been saved to the users phone, if not then copy it over 
     BOOL success; 

     // Create a FileManager object, we will use this to check the status 
     // of the database and to copy it over if required 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 

     // Check if the database has already been created in the users filesystem 
     success = [fileManager fileExistsAtPath:path]; 

     // If the database already exists then dont do anything 
     if(!success) 
     { 
      NSLog(@"not success"); 
      // If not then proceed to copy the database from the application to the users filesystem 

      // Get the path to the database in the application package 
      NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"pero1.sqlite"]; 

      // Copy the database from the package to the users filesystem 
      [fileManager copyItemAtPath:databasePathFromApp toPath:path error:nil]; 

     } 
     NSLog(@"success"); 

     if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) { 
      //NSLog(@"Database Successfully Opened :)"); 
      userDB = newDBconnection; 
     } else { 
      NSLog(@"Error in opening database :("); 
      userDB = NULL; 
    return; 
     } 
    } 
    wordlist = [[NSMutableArray alloc] init]; 

NSString *query = [NSString stringWithFormat:@"SELECT word FROM words WHERE word LIKE '%@%%'",selectedWord]; 
     NSLog(@"query: %@",query); 

     const char *sqlStatement = [query UTF8String]; 
     sqlite3_stmt *compiledStatement; 
    NSString *listFromDB = @""; 
     if(sqlite3_prepare_v2(userDB, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
     { 
      // Loop through the results and add them to the feeds array 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       // Read the data from the result row 
       char *id1 = (char *)sqlite3_column_text(statement, 0); 
      [wordlist addObject:[NSString stringWithFormat:@"%s",id1]]; 

       } 
     } 
     // Release the compiled statement from memory 
     sqlite3_finalize(compiledStatement); 
+0

Этот тоже отлично работает! Спасибо Анум. – Chiran

+0

Вы можете поддержать мой ответ, если это помогло u :) – NightFury

0

Ganapathy ваш код работает отлично! Но вместо того, чтобы открывать базу данных перед каждым выбором запроса,

Я пробовал это в своем коде, и это работает как шарм!

Смежные вопросы