2014-02-17 96 views
8

在創建新表時遇到一些問題。當我使用CREATE TABLE命令時,我的新表格按其應有的形式形成,但是當我退出該活動時,應用程序崩潰並在logcat中獲得TABLE ALREADY EXISTS。如果我使用CREATE TABLE IF NOT EXISTS,則不會形成新表,但會將我的新數據行添加到上一個表中,並且不會崩潰。這有什麼問題?我想添加沒有它給我已經存在的表,我希望它添加沒有它添加行到不同的表。android sqlite創建表如果不存在

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); 
} 

} 

回答

28

這就是它的應該如何工作。如果表已經存在,CREATE TABLE將引發異常。如果該表不存在,或者忽略該命令(如果存在),則CREATE TABLE IF NOT EXISTS將創建表。如果您想要刪除舊錶,請在CREATE TABLE之前使用DELETE TABLE IF EXISTS。如果要更改架構,請使用ALTER TABLE而不是CREATE TABLE

+0

我不明白,爲什麼在CREATE TABLE IF NOT EXISTS是添加行前面的表。 – johnsonjp34

+0

它不會,但如果您有任何添加行的代碼,則會將其添加到該現有表中 - CREATE IF NOT EXISTS不會刪除舊數據。 –

-1

我用這樣的:

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; } 
    }