Saya mencoba memasukkan data yang disimpan dalam NSMutableArray dan menyimpannya di Database SQLite.. Sejauh ini saya hanya dapat memasukkan 5 elemen pertama dari array atau memasukkan semuanya ke dalam kolom pertama DB. Saya tidak tahu di mana itu rusak/tidak berfungsi.

Isi dari lockInfo (NSMutableArray):

LOCKINFO (
    51974,
    0,
    2,
    15,
    1,
    51975,
    0,
    24,
    15,
    1,
    51976,
    0,
    20,
    15,
    1,
    51977,
    0,
    23,
    15,
    1
    )

Semua yang dimasukkan ke dalam baris pertama adalah:

51974,
    0,
    2,
    15,
    1

Kode:

-(void)insertLock:(NSMutableArray *)lockInfo{
    char *error;
    NSString *databasePath = [self dataPath:@"eloqdb.sqlite3"];
    sqlite3 *database;
    if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSLog(@"Could not open database");
    }else{
        NSLog(@"DB opened");
    }

    //for each element in the array, save the array index, and the contact:

     NSLog(@"count %@", lockInfo);

    NSLog(@"count %i", lockInfo.count);

    for (int i = 0; i < lockInfo.count; i++) {


        sqlite3_stmt *statement;
        NSString *SQLInsert = @"INSERT OR REPLACE INTO LOCK_PLAN_CHANGE (ID, FLAG, ITEM_DOOR_ID, KEY_SERIAL, TIMEZONE_ITEM_ID) "
        @"VALUES (?, ?, ?, ?, ?);";
        if (sqlite3_prepare_v2(database, [SQLInsert UTF8String], -1,
                               &statement, nil) == SQLITE_OK)
        {
            sqlite3_bind_text(statement, 1, [[lockInfo objectAtIndex:i] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [[lockInfo objectAtIndex:i] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [[lockInfo objectAtIndex:i] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 4, [[lockInfo objectAtIndex:3] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 5, [[lockInfo objectAtIndex:4] UTF8String], -1, NULL);
        }
        if (sqlite3_step(statement) != SQLITE_DONE) {
            // NSAssert1(0, @"Cannot Update Table", error);
        }
        sqlite3_finalize(statement);
    }
    sqlite3_close(database);
}
0
astric mobiles 19 Maret 2019, 16:13

1 menjawab

Jawaban Terbaik

Array Anda sebenarnya berisi data senilai lockInfo.count / 5 baris.

Ubah lingkaran Anda menjadi:

for (int i = 0; i < lockInfo.count; i += 5) {

Kemudian perbarui ikatan ke:

sqlite3_bind_text(statement, 1, [[lockInfo objectAtIndex:i] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 2, [[lockInfo objectAtIndex:i+1] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 3, [[lockInfo objectAtIndex:i+2] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 4, [[lockInfo objectAtIndex:i+3] UTF8String], -1, NULL);
sqlite3_bind_text(statement, 5, [[lockInfo objectAtIndex:i+4] UTF8String], -1, NULL);

Perubahan tersebut akan menempatkan nilai yang benar di kolom yang benar dan akan menambahkan jumlah baris yang benar.

BTW - ini adalah struktur data yang sangat buruk. Anda harus mendefinisikan kelas atau struct dengan 5 properti. Kemudian miliki array kelas atau struct itu.

Selain masalah utama itu, Anda juga tidak menggunakan pernyataan yang disiapkan dengan benar. Anda harus menyiapkan pernyataan hanya sekali sebelum loop.

Inilah kode Anda yang ditulis dengan benar dengan pemeriksaan kesalahan yang lebih baik juga:

- (void)insertLock:(NSMutableArray *)lockInfo {
    NSString *databasePath = [self dataPath:@"eloqdb.sqlite3"];
    sqlite3 *database;
    if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) {
        NSLog(@"Could not open database");
        return;
    } else {
        NSLog(@"DB opened");
    }

    //for each element in the array, save the array index, and the contact:

    NSLog(@"lockInfo %@", lockInfo);
    NSLog(@"count %i", lockInfo.count);

    sqlite3_stmt *statement;
    NSString *SQLInsert = @"INSERT OR REPLACE INTO LOCK_PLAN_CHANGE (ID, FLAG, ITEM_DOOR_ID, KEY_SERIAL, TIMEZONE_ITEM_ID) VALUES (?, ?, ?, ?, ?);";
    if (sqlite3_prepare_v2(database, [SQLInsert UTF8String], -1, &statement, nil) == SQLITE_OK) {
        for (NSInteger i = 0; i < lockInfo.count; i += 5) {
            sqlite3_bind_text(statement, 1, [lockInfo[i] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 2, [lockInfo[i+1] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 3, [lockInfo[i+2] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 4, [lockInfo[i+3] UTF8String], -1, NULL);
            sqlite3_bind_text(statement, 5, [lockInfo[i+4] UTF8String], -1, NULL);

            if (sqlite3_step(statement) != SQLITE_DONE) {
                // NSAssert1(0, @"Cannot Update Table", error);
            }
            sqlite3_reset(statement);
        }
        sqlite3_finalize(statement);
    } else {
        NSLog(@"Can't prepare: %s", sqlite3_errmsg(database));
    }
    sqlite3_close(database);
}
1
rmaddy 19 Maret 2019, 13:50