我正在使用Objective C在iOS上使用键盘扩展,我正在使用SQLite。我需要了解一些关于SQLite的概念,我没有通过谷歌搜索获得。让我将问题分成几部分。
PART:1
我在SQLite中遇到了一个名为PRAGMA cache_size = pages;
此处的默认大小为2000页。 根据我的理解,与默认相比,
我在这里纠正吗?
PART:2
我正在尝试以下列方式更改cache_size,
if (sqlite3_exec(sqlite3Database, [@"PRAGMA CACHE_SIZE=50;" UTF8String], NULL, NULL, NULL) == SQLITE_OK) {
NSLog(@"Successfully changed cache size");
}
else
NSLog(@"Error: failed to set cache size with message %s.", sqlite3_errmsg(sqlite3Database));
打开数据库后我正在使用它。以下代码显示了它,
-(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable{
// Create a sqlite object.
sqlite3 *sqlite3Database;
// Set the database file path.
NSString *databasePath = [self getDbFilePath];
// Initialize the results array.
if (self.arrResults != nil) {
[self.arrResults removeAllObjects];
self.arrResults = nil;
}
self.arrResults = [[NSMutableArray alloc] init];
// Open the database.
BOOL openDatabaseResult = sqlite3_open([databasePath UTF8String], &sqlite3Database);
if(openDatabaseResult == SQLITE_OK) {
if (sqlite3_exec(sqlite3Database, [@"PRAGMA CACHE_SIZE=50;" UTF8String], NULL, NULL, NULL) == SQLITE_OK) {
NSLog(@"Successfully changed cache size");
}
else
NSLog(@"Error: failed to set cache size with message %s.", sqlite3_errmsg(sqlite3Database));
// Declare a sqlite3_stmt object in which will be stored the query after having been compiled into a SQLite statement.
sqlite3_stmt *compiledStatement;
// Load all data from database to memory.
BOOL prepareStatementResult = sqlite3_prepare_v2(sqlite3Database, query, -1, &compiledStatement, NULL);
if(prepareStatementResult == SQLITE_OK) {
// Check if the query is non-executable.
if (!queryExecutable){
// In this case data must be loaded from the database.
// Declare an array to keep the data for each fetched row.
NSMutableArray *arrDataRow;
// Loop through the results and add them to the results array row by row.
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Initialize the mutable array that will contain the data of a fetched row.
arrDataRow = [[NSMutableArray alloc] init];
// Get the total number of columns.
int totalColumns = sqlite3_column_count(compiledStatement);
// Go through all columns and fetch each column data.
for (int i=0; i<totalColumns; i++){
// Convert the column data to text (characters).
char *dbDataAsChars = (char *)sqlite3_column_text(compiledStatement, i);
// If there are contents in the currenct column (field) then add them to the current row array.
if (dbDataAsChars != NULL) {
// Convert the characters to string.
[arrDataRow addObject:[NSString stringWithUTF8String:dbDataAsChars]];
}
}
// Store each fetched data row in the results array, but first check if there is actually data.
if (arrDataRow.count > 0) {
[self.arrResults addObject:arrDataRow];
}
}
}
else {
// This is the case of an executable query (insert, update, ...).
// Execute the query.
int executeQueryResults = sqlite3_step(compiledStatement);
if (executeQueryResults == SQLITE_DONE) {
// Keep the affected rows.
self.affectedRows = sqlite3_changes(sqlite3Database);
// Keep the last inserted row ID.
self.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database);
}
else {
// If could not execute the query show the error message on the debugger.
NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database));
}
}
}
else {
// In the database cannot be opened then show the error message on the debugger.
NSLog(@"db error: %s", sqlite3_errmsg(sqlite3Database));
}
// Release the compiled statement from memory.
sqlite3_finalize(compiledStatement);
}
// Close the database.
sqlite3_close(sqlite3Database);
}
但是,当我调用方法sqlite3_exec(sqlite3Database, [@"PRAGMA CACHE_SIZE=50;" UTF8String], NULL, NULL, NULL)
时,无论我做什么,它总是会SQLITE_OK
。
例如,如果我sqlite3_exec(sqlite3Database, [@"abcd bla bla" UTF8String], NULL, NULL, NULL)
,则会返回SQLITE_OK
!!
为什么会这样?
PART:3
我想提高查询的执行速度,但同时又不想使用IMDB,因为数据库的大小很大。
PRAGMA page_size = bytes;
在这种情况下是否有任何相关性?如果是,那么如何在Objective C中做到这一点?
感谢任何帮助。谢谢和问候。