Pytanie android sqlite STWÓRZ TABELĘ, JEŚLI NIE ISTNIEJSZY


Mając mały problem z tworzeniem nowych tabel. Kiedy używam polecenia CREATE TABLE, moje nowe tabele tworzą się tak, jak powinny, ale kiedy wyjdę z działania, aplikacja się zawiesza i otrzymuję TABELĘ JUŻ ZNANY w kodzie logcat. Jeśli używam CREATE TABLE IF NOT EXISTS, nowa tabela nie jest tworzona, ale po prostu dodaje moje nowe wiersze danych do poprzedniej tabeli i nie ulega awarii. Co jest z tym nie tak? Chciałbym dodać tabelę bez niej, dając mi już istniejącą i chciałbym ją dodać bez dodawania wierszy do innej tabeli.

Klasa SqliteHelper:

public class MySQLiteHelper extends SQLiteOpenHelper {


public static final String TABLE_NAME = MainActivity.NameName;

public static final String COLUMN_ID = "_id";
public static final String COLUMN_COMMENT = "comment";
public static final String COLUMN_LAT = "lat";
public static final String COLUMN_LONG = "long";
public static final String COLUMN_RADI = "radi";
private static final String DATABASE_NAME = "spraylogs.db";
private static final int DATABASE_VERSION = 1;



public static final String NEWTABLE = "CREATE TABLE  "
         + TABLE_COMMENTS + "(" + COLUMN_ID
          + " integer primary key autoincrement, " + COLUMN_COMMENT
          + " text not null," + COLUMN_LAT+ ","  + COLUMN_LONG + "," + COLUMN_RADI +  ");";

public static final String SaveIt = "CREATE TABLE IF NOT EXISTS "
         + TABLE_COMMENTS + "(" + COLUMN_ID
          + " integer primary key autoincrement, " + COLUMN_COMMENT
          + " text not null," + COLUMN_LAT+ ","  + COLUMN_LONG + "," + COLUMN_RADI +  ");";



 MySQLiteHelper(Context context) {
  super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase database) {
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(MySQLiteHelper.class.getName(),
    "Upgrading database from version " + oldVersion + " to "
        + newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + NEWTABLE);

onCreate(db);
 } 

} 

12
2018-02-17 19:58


pochodzenie




Odpowiedzi:


Tak to powinno działać. CREATE TABLE rzuci wyjątek, jeśli tabela już istnieje. CREATE TABLE IF NOT EXISTS utworzy tabelę, jeśli nie istnieje, lub zignoruje polecenie, jeśli tak się stanie. Jeśli chcesz usunąć starą tabelę, użyj DELETE TABLE IF EXISTS przed CREATE TABLE. Jeśli chcesz zmienić schemat, użyj ALTER TABLE, nie CREATE TABLE.


32
2018-02-17 20:10



Nie rozumiem, dlaczego CREATE TABLE IF NOT EXISTS dodaje wiersze do poprzedniej tabeli. - johnsonjp34
Nie, ale jeśli masz jakiś kod, który dodaje wiersz, dodawałby go do istniejącej tabeli - CREATE IF NOT EXISTS nie usuwa starych danych. - Gabe Sechan


Używam go w ten sposób:

   internal static int checkTable()
    {
        DataTable dTable = new DataTable();
        try
        {
            dbConn = new SQLiteConnection("Data Source=" + dbFileName + ";Version=3;");
            dbConn.Open();
            sqlCmd.Connection = dbConn;

            String makeTable = "CREATE TABLE IF NOT EXISTS responde( id INTEGER PRIMARY KEY AUTOINCREMENT, sid TEXT, ans TEXT, answe TEXT, questid TEXT, timestamp TEXT)";

            sqlCmd.CommandText = makeTable;
            sqlCmd.ExecuteNonQuery();
            return 1;
        }
        catch (SQLiteException) { Console.WriteLine("Error DB 100"); return 0; }
        catch (IndexOutOfRangeException) { Console.WriteLine("Error DB 101"); return 0; }
        catch (TypeInitializationException) { Console.WriteLine("Error DB 102"); return 0; }
    }

-1
2017-08-13 08:18