我无法在文档目录中创建sqlite数据库。 这是代码:
NSString *fileDir;
NSArray *dirPaths;
//Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask, YES);
fileDir = [dirPaths objectAtIndex:0];
// Build the database path
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sql"]];
NSFileManager *fileMgr = [NSFileManager defaultManager];
if([fileMgr fileExistsAtPath:databasePath] == NO)
{
const char *dbPath = [databasePath UTF8String];
if (sqlite3_open(dbPath, &database) == SQLITE_OK)
{
char *errMsg;
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS(ID INTEGER PRIMARY KEY , NAME TEXT, ADDRESS TEXT, MOBILE INTEGER)";
if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) {
_status.text = @"Failed to create table";
}
sqlite3_close(database);
}
else
{
_status.text = @"Failed to open/create database";
}
}
我调试了代码,发现编译器不会处于这种情况下。 sqlite3_open(dbPath,& database)== SQLITE_OK
我不知道我做错了什么。 任何帮助将不胜感激......
谢谢,
答案 0 :(得分:1)
检查代码以获取dirPath,你是否正确路径,我在我的代码中使用了以下方式并为我工作:
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask,YES);
fileDir = dirPaths[0];
// Build the database path
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sqlite"]];
答案 1 :(得分:1)
这就是我管理它的方式。
DataBaseAccess.m
static sqlite3 *database=nil;
-(id)init
{
if(self=[super init])
{
self.user_data=@"user_data.db";
}
return self;
}
-(void)createUserDataDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:user_data];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return;
// construct database from external ud.sql
NSString *filePath=[[NSBundle mainBundle]pathForResource:@"ud" ofType:@"sql"];
NSString *sqlStatement=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
if(sqlite3_open([writableDBPath UTF8String], &database)==SQLITE_OK)
{
sqlite3_exec(database, [sqlStatement UTF8String], NULL, NULL, NULL);
sqlite3_close(database);
}
}
您的外部sql文件必须包含sql查询:
CREATE TABLE quantityInSubCountries (
refID INT,
quantity INT
);
CREATE TABLE quantityInSubRegions (
refID INT,
quantity INT
); ....
希望它会有所帮助。
答案 2 :(得分:0)
这是用于数据库的常用方法
-(void)updateTable:(NSString *)tableName setname:(NSString *)Name setImagePath:(NSString *)imagePath whereID:(NSInteger)rid{
NSString *sqlString=[NSString stringWithFormat:@"update %@ set name='%@' where id=%ld",tableName,Name,rid];
char *error;
if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
[self closeDatabase];
NSLog(@"Faield to update");
}
else{
NSLog(@"update successfully");
}
}
-(void)deleteFrom:(NSString *)tablename whereName:(NSInteger )rid {
NSString *sqlString=[NSString stringWithFormat:@"delete from %@ where id=%ld",tablename,(long)rid];
char *error;
if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
[self closeDatabase];
NSLog(@"faield to Delete");
}
else{
NSLog(@"Deleted successfully");
}
}
-(void)insertInTable:(NSString *)tableName withName:(NSString *)name withImagePath:(NSString *)imagePath
{
NSString *sqlString=[NSString stringWithFormat:@"insert into %@(name,path)values('%@','%@')",tableName,name,imagePath];
char *error;
if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
[self closeDatabase];
NSLog(@"Failed to insert");
}
else{
NSLog(@"Inserted succesfully");
}
}
-(NSString *)path
{
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDir=[paths objectAtIndex:0];
return [documentDir stringByAppendingPathComponent:@"Storage.db"];
}
-(void)open{
if(sqlite3_open([[self path] UTF8String], &db)!=SQLITE_OK)
{
sqlite3_close(db);
NSLog(@"your database table has been crash");
}
else{
NSLog(@"Database open successfully");
}
}
-(void)closeDatabase
{
sqlite3_close(db);
NSLog(@"Database closed");
}
-(void)copyFileToDocumentPath:(NSString *)fileName withExtension:(NSString *)ext{
NSString *filePath=[self path];
NSFileManager *fileManager=[NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:filePath]) {
NSString *pathToFileInBundle=[[NSBundle mainBundle] pathForResource:fileName ofType:ext];
NSError *err=nil;
BOOL suc=[fileManager copyItemAtPath:pathToFileInBundle toPath:filePath error:&err];
if (suc) {
NSLog(@"file copied successfully");
}
else
{
NSLog(@"faield to copied");
}
}
else
{
NSLog(@"File allready present");
}
}
-(NSMutableArray *)AllRowFromTableName:(NSString *)tableName{
NSMutableArray *array=[[NSMutableArray alloc] init];
NSString *sqlString=[NSString stringWithFormat:@"select *from %@",tableName];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &statement, nil)==SQLITE_OK) {
while (sqlite3_step(statement)==SQLITE_ROW) {
Database *tempDatabase=[[Database alloc] init];
tempDatabase.Hid=sqlite3_column_int(statement, 0);
tempDatabase.Hname =[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
tempDatabase.Hpath=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
[array addObject:tempDatabase];
}
}
return array;
}
-(void)test
{
//Pet photos
NSString *sqlString=[NSString stringWithFormat:@"create table if not exists StorageTable(id integer primary key autoincrement,name text,path text)"];
char *error;
if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
[self closeDatabase];
NSLog(@"Faield to blanck 1 %s",error);
}
else{
NSLog(@"Test On StorageTable Database successfully");
}
}