0

我在文档文件夹应用程序中有一个 sqlite DB。我将来自 NSDictionary 的数据存储在 sqlite DB 中。我想如何了解 sqlite 数据库中有多少行并将其放入 NSString 变量中。

这是我在 sqlite 中存储数据的代码(在文档文件夹中):

#define DatabaseName @"data.sqlite"
@implementation ViewController
- (void)viewDidLoad
{
    //NSString *rowNumber = I dont know how to Obtain number of rows...
    [super viewDidLoad];
    NSArray *idd = [NSArray arrayWithObjects:@"122",@"234",@"453", nil];
    NSArray *name = [NSArray arrayWithObjects:@"janatan",@"fred",@"john", nil];
    NSArray *age = [NSArray arrayWithObjects:@"23",@"35",@"12", nil];
    NSArray *sex = [NSArray arrayWithObjects:@"male",@"male",@"male", nil];
    NSString *query2  = [NSString stringWithFormat:@"select * from table1 where name = 'john'"];
    NSLog(@"query : %@",query2);
    BOOL recordExist = [self recordExistOrNot:query2];
    if (!recordExist) {
        for (int i = 0; i < [idd count]; i++) {
            NSString * a = [idd objectAtIndex:i];
            NSString * b = [name objectAtIndex:i];
            NSString * c = [age objectAtIndex:i];
            NSString * d = [sex objectAtIndex:i];
            NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:a,@"id",b,@"name",c,@"age",d,@"sex", nil];
            NSString *query = [NSString stringWithFormat:@"insert into table1 (id,name,age,sex) values('%@','%@','%@','%@')",[dic objectForKey:@"id"],[dic objectForKey:@"name"],[dic objectForKey:@"age"],[dic objectForKey:@"sex"]];
            NSLog(@"%@",query);
            [self executeQuery:query];
        }
    }
}
-(NSString *) dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //NSLog(@"PATH %@",[documentsDirectory stringByAppendingPathComponent:DatabaseName]);
    return [documentsDirectory stringByAppendingPathComponent:DatabaseName];
}
/*==================================================================
 METHOD FOR CHECKING WHETHER RECORD EXISTS OR NOT IN DATABASE
 ==================================================================*/
-(BOOL)recordExistOrNot:(NSString *)query{
    BOOL recordExist=NO;
    if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK) {
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil)==SQLITE_OK) {
            if (sqlite3_step(statement)==SQLITE_ROW) {
                recordExist=YES;
            } else {
                //////NSLog(@"%s,",sqlite3_errmsg(database));
            }
            sqlite3_finalize(statement);
            sqlite3_close(database);
        }
    }
    return recordExist;
}
/*==================================================================
 METHOD FOR INSERTING DATA IN DATABASE
 ==================================================================*/
-(void)executeQuery:(NSString *)query {
    sqlite3_stmt *statement;
    if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK) {
        if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK) {
            if (sqlite3_step(statement) != SQLITE_DONE) {
                sqlite3_finalize(statement);
            }
        } else {
            NSLog(@"query Statement Not Compiled");
        }
        sqlite3_finalize(statement);
        sqlite3_close(database);
    } else {
        NSLog(@"Data not Opened");
    }
}
@end

你猜顶部的 NSArray 有多少个值(不是四个)。

4

2 回答 2

3

请尝试使用这个

执行这个查询

select count(*) from table_name;

- (int) getNumberOfRecord
{
    int count = 0;
    if (sqlite3_open([self.dataBasePath UTF8String], &database) == SQLITE_OK)
    {
        const char* sqlStatement = "SELECT COUNT(*) FROM table1";
        sqlite3_stmt *statement;

        if( sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK )
        {
            //Loop through all the returned rows (should be just one)
            while( sqlite3_step(statement) == SQLITE_ROW )
            {
                count = sqlite3_column_int(statement, 0);
            }
        }
        else
        {
            NSLog( @"Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(database) );
        }

        // Finalize and close database.
        sqlite3_finalize(statement);
        sqlite3_close(database);
    }

    return count;
}

我希望它对你有帮助。

于 2013-05-01T12:10:06.773 回答
0
/**
 Load Database
 **/
func loadDatabase() {
    let fileUrl = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("yourdatabase.sqlite")

    if(sqlite3_open(fileUrl.path, &db) != SQLITE_OK) {
        print("Error opening database")
        createAlert(title: "Information", message: "Error opening database")
        return
    } else {
        print("Everything Look Great")
    }

}    

/**
 * Count Trip New
 *
 * @return
 */
func getCountTripNew() -> Int{
    loadDatabase()

    var count : Int = 0
    //this is your select query
    let queryString = "SELECT COUNT(*) FROM trip "

    //statement pointer
    var stmt:OpaquePointer?

    //preparing the query
    if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing count trip: \(errmsg)")
        return 0
    }

    //traversing through all the records
    while(sqlite3_step(stmt) == SQLITE_ROW){
        count = Int(sqlite3_column_int(stmt, 0))

    }

    sqlite3_finalize(stmt)
    sqlite3_close(self.db)

    return count
}
于 2018-10-31T13:20:02.573 回答