2016-07-20 12 views
0
aktualisiert

Ich fand einen DB-Adapter, der das Internet nach androiden Betriebsmitteln sucht. Ich versuche gerade Informationen wie den Standort in der Datenbank zu speichern. Ich habe es funktioniert, aber wenn ich zurück gehe und versuche, weitere Spalten hinzuzufügen, erhalte ich Fehler wie "die Spalte existiert nicht". Meine Frage ist also, wie kann ich die Datenbank löschen und sie mit diesen neuen Spalten neu erstellen? hier ist mein Code, alles hat funktioniert, bis ich die "Stempel" -String ...Android SQL Lite DB-Adapter, der DB

// ------------------------------------ DBADapter.java --------------------------------------------- 

// TODO: Change the package to match your project. 
package biz.tanners.geo_x; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 


// TO USE: 
// Change the package (at top) to match your project. 
// Search for "TODO", and make the appropriate changes. 
public class DBAdapter { 

    ///////////////////////////////////////////////////////////////////// 
    // Constants & Data 
    ///////////////////////////////////////////////////////////////////// 
    // For logging: 
    private static final String TAG = "DBAdapter2"; 

    // DB Fields 
    public static final String KEY_ROWID = "_id"; 
    public static final int COL_ROWID = 0; 
    /* 
    * CHANGE 1: 
    */ 
    // TODO: Setup your fields here: 
    public static final String KEY_NAME = "name"; 
    public static final String KEY_LONGITUDE = "longitude"; 
    public static final String KEY_LATTITUDE = "lattitude"; 
    public static final String KEY_STAMP = "stamp"; 

    // TODO: Setup your field numbers here (0 = KEY_ROWID, 1=...) 
    public static final int COL_NAME = 1; 
    public static final int COL_LONGITUDE= 2; 
    public static final int COL_LATTITUDE = 3; 
    public static final int COL_STAMP = 4; 


    public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_NAME, KEY_LONGITUDE, KEY_LATTITUDE, KEY_STAMP}; 
    public static final String DATABASE_NAME = "MyDb"; 
    public static final String DATABASE_TABLE = "mainTable"; 
    public static final int DATABASE_VERSION = 4; 

    private static final String DATABASE_CREATE_SQL = 
      "create table " + DATABASE_TABLE 
      + " (" + KEY_ROWID + " integer primary key autoincrement, " 

      /* 
      * CHANGE 2: 
      */ 
      // TODO: Place your fields here! 
      // + KEY_{...} + " {type} not null" 
      // - Key is the column name you created above. 
      // - {type} is one of: text, integer, real, blob 
      //  (http://www.sqlite.org/datatype3.html) 
      // - "not null" means it is a required field (must be given a value). 
      // NOTE: All must be comma separated (end of line!) Last one must have NO comma!! 
      + KEY_NAME + " text not null, " 
      + KEY_LONGITUDE + " double not null, " 
      + KEY_LATTITUDE + " double not null, " + KEY_STAMP + " text not null" 

      // Rest of creation: 
      + ");"; 

    // Context of application who uses us. 
    private final Context context; 

    private DatabaseHelper myDBHelper; 
    private SQLiteDatabase db; 

    ///////////////////////////////////////////////////////////////////// 
    // Public methods: 
    ///////////////////////////////////////////////////////////////////// 

    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     myDBHelper = new DatabaseHelper(context); 
    } 

    // Open the database connection. 
    public DBAdapter open() { 
     db = myDBHelper.getWritableDatabase(); 
     return this; 
    } 

    // Close the database connection. 
    public void close() { 
     myDBHelper.close(); 
    } 

    // Add a new set of values to the database. 
    public long insertRow(String name, double longitude, double lattitude, String stamp) { 
     /* 
     * CHANGE 3: 
     */  
     // TODO: Update data in the row with new fields. 
     // TODO: Also change the function's arguments to be what you need! 
     // Create row's data: 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_NAME, name); 
     initialValues.put(KEY_LONGITUDE, longitude); 
     initialValues.put(KEY_LATTITUDE, lattitude); 
     initialValues.put(KEY_STAMP, stamp); 

     // Insert it into the database. 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    // Delete a row from the database, by rowId (primary key) 
    public boolean deleteRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     return db.delete(DATABASE_TABLE, where, null) != 0; 
    } 

    public void deleteAll() { 
     Cursor c = getAllRows(); 
     long rowId = c.getColumnIndexOrThrow(KEY_ROWID); 
     if (c.moveToFirst()) { 
      do { 
       deleteRow(c.getLong((int) rowId));    
      } while (c.moveToNext()); 
     } 
     c.close(); 
    } 

    // Return all data in the database. 
    public Cursor getAllRows() { 
     String where = null; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
          where, null, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Get a specific row (by rowId) 
    public Cursor getRow(long rowId) { 
     String where = KEY_ROWID + "=" + rowId; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         where, null, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Change an existing row to be equal to new data. 
    public boolean updateRow(long rowId, String name, double longitude, double lattitude, String stamp) { 
     String where = KEY_ROWID + "=" + rowId; 

     /* 
     * CHANGE 4: 
     */ 
     // TODO: Update data in the row with new fields. 
     // TODO: Also change the function's arguments to be what you need! 
     // Create row's data: 
     ContentValues newValues = new ContentValues(); 
     newValues.put(KEY_NAME, name); 
     newValues.put(KEY_LONGITUDE, longitude); 
     newValues.put(KEY_LATTITUDE, lattitude); 
     newValues.put(KEY_STAMP, stamp); 

     // Insert it into the database. 
     return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
    } 
    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase _db) { 
      _db.execSQL(DATABASE_CREATE_SQL);   
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading application's database from version " + oldVersion 
        + " to " + newVersion + ", which will destroy all old data!"); 

      // Destroy old database: 
      _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

      // Recreate new database: 
      onCreate(_db); 
     } 
    } 
} 

                  Error Code : 1 (SQLITE_ERROR) 
                  Caused By : SQL(query) error or missing database. 
                  (no such column: stamp (code 1): , while compiling: SELECT DISTINCT _id, name, longitude, lattitude, stamp FROM mainTable2) 
+0

Haben Sie die Db-Version vor dem Lauf inkrementiert? –

Antwort

1

gebe ich Ihnen Antwort, wie ich verstanden habe. Sie können eine Sprungtabellenabfrage erstellen und aufrufen, dass Sie, wenn Sie diese Tabelle oder Tabellen löschen müssen, und wann immer Sie diese Tabelle erstellen möchten, eine Tabellenabfrage erstellen können.

Verwandte Themen