Tôi đang cố gắng tạo tệp cơ sở dữ liệu SQLite3 thông qua Objective-C khi chạy. Tôi đang cố tạo một bảng có tên là "tblStore". Tôi muốn các tên trường được gọi là "strStoreNumber" và "strStoreReg". Tôi mới sử dụng iOS và SQLite, vì vậy tôi đang gặp khó khăn khi tìm cú pháp để thực hiện việc này. Ngoài việc tạo bảng, tôi muốn bảng được tạo để cư trú KHÔNG trong gói ứng dụng, mà là nó sẽ cư trú/được lưu trữ ở đâu đó trên điện thoại. Bảng cần phải có thể đọc/ghi được. Tôi đã thực hiện một số đọc trên "sandbox người dùng" và cũng là một "thư mục tài liệu". Tôi không chắc tôi hiểu sự khác biệt giữa hai người. Lý tưởng nhất, ứng dụng của tôi sẽ sử dụng nút để nhập liệu từ Trường văn bản. Sau khi đầu vào từ các trường văn bản được đưa vào chuỗi, một kiểm tra sẽ được thực hiện để xem bảng SQLite "tblStore" của tôi có tồn tại hay không và nếu không, bảng sẽ được tạo.Tạo tệp cơ sở dữ liệu SQLite3 thông qua Objective-C
Tóm tắt: 1. Cú pháp cho Obj-C/SQLite là gì để tạo bảng có tên "tblStore" với các trường "strStoreNumber" và "strStoreReg"? 2. Tệp db nằm ở đâu? Tôi cần đọc và ghi vào tệp db tblStore. 3. Sự khác nhau giữa "sandbox của người dùng" và "thư mục tài liệu" là gì?
Đây là những gì tôi hiện có:
-(IBAction)setInput:(id)sender
{
NSString *strStoreNumber;
NSString *strRegNumber;
NSString *tableName = @"tblStore";
NSString *dbStrStore = @"strStore";
NSString *dbStrReg = @"strReg";
strStoreNumber = StoreNumber.text;
strRegNumber = RegNumber.text;
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths lastObject];
NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"];
// NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
NSLog(@"Opened sqlite database at %@", databasePath);
char *err;
NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' TEXT PRIMARY KEY, '%@' TEXT);", tableName, dbStrStore, dbStrReg];
if (sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK)
{
sqlite3_close(database);
NSAssert(0, @"Table failed to create.");
}
//...stuff
}
else
{
NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database));
sqlite3_close (database);
}
NSString *querystring;
// create your statement
querystring = [NSString stringWithFormat:@"SELECT strStore, strReg FROM tblStore WHERE strStore = %@ AND strReg = %@;", strStoreNumber, strRegNumber];
const char *sql = [querystring UTF8String];
NSString *szStore = nil;
NSString *szReg = nil;
sqlite3_stmt *statement = nil;
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) //queryString = Statement
{
NSLog(@"sql problem occured with: %s", sql);
NSLog(@"%s", sqlite3_errmsg(database));
}
else
{
// you could handle multiple rows here
while (sqlite3_step(statement) == SQLITE_ROW)
{
szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)];
}
}
sqlite3_finalize(statement);
lblStoreNumber.text = szStore;
lblRegNumber.text = szReg;
}
Khi tôi chạy ứng dụng của tôi, tôi nhận được các lỗi sau đây:
2012-05-10 14:58:38.169 CCoDBTry[355:f803] Opened sqlite database at /Users/Matt****/Library/Application Support/iPhone Simulator/5.1/Applications/5DB7A218-A0F6- 485F-B366-91FD2F9BC062/Documents/tblStore.sqlite
2012-05-10 14:58:38.307 CCoDBTry[355:f803] sql problem occured with: SELECT strStore, strReg FROM tblStore WHERE strStore = 8053 AND strReg = 4;
2012-05-10 14:58:38.308 CCoDBTry[355:f803] no such column: strStore
Tôi đánh giá cao bất cứ ai mất thời gian ra để giải thích một số điều này công cụ, như tôi rất mới và đã không thành công trong việc hoàn thành một số trong những điều tôi đã cố gắng. Cảm ơn rất nhiều vì sự giúp đỡ!
Điều này thực sự hữu ích, nhưng tôi đã hy vọng tránh được bất kỳ loại trình bao bọc hoặc thư viện bên ngoài nào. Tôi sẽ giữ các câu trả lời khác để xem liệu có ai có thể cung cấp một số thông tin chi tiết về cú pháp tạo bảng thuần túy sẽ trông như thế nào không. Bất cứ điều gì tôi đã diễn ra trong ứng dụng của tôi không ổn, haha. Cảm ơn bạn đã trả lời nhanh chóng! – Skizz
cũng là quyết định của bạn .. nhưng hãy nhớ rằng sử dụng trình bao bọc, bạn sẽ chỉ phải sử dụng các cuộc gọi c mục tiêu ... như [self getRow: 2]. Đó là A LOT dễ dàng hơn so với tất cả các cuộc gọi sql: mở db, thực hiện một tuyên bố, exec các tuyên bố, sau đó xem nếu nó không nil, xử lý lỗi, xử lý dữ liệu, và sau đó đóng. Đó là một nỗi đau chỉ để viết. – skytz