android sqlite 如果不存在则创建表

Posted

技术标签:

【中文标题】android sqlite 如果不存在则创建表【英文标题】:android sqlite CREATE TABLE IF NOT EXISTS 【发布时间】:2014-03-17 06:54:13 【问题描述】:

在创建新表时遇到了一点问题。当我使用 CREATE TABLE 命令时,我的新表按应有的方式形成,但是当我退出活动时,应用程序崩溃并且我在 logcat 中得到一个 TABLE ALREADY EXISTS。如果我使用 CREATE TABLE IF NOT EXISTS,则不会形成新表,而只是将我的新数据行添加到以前的表中,并且不会崩溃。这有什么问题?我想添加表格而不给我已经存在的信息,我希望添加它而不向其他表格添加行。

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

 

【问题讨论】:

【参考方案1】:

这就是它应该如何工作的方式。如果表已经存在,CREATE TABLE 将抛出异常。 CREATE TABLE IF NOT EXISTS 如果表不存在则创建表,如果存在则忽略该命令。如果您希望它删除旧表,请在CREATE TABLE 之前使用DELETE TABLE IF EXISTS。如果要更改架构,请使用ALTER TABLE,而不是CREATE TABLE

【讨论】:

我不明白为什么 CREATE TABLE IF NOT EXISTS 会在前一个表中添加行。 不会,但如果您有任何添加行的代码,它会将其添加到现有表中 - CREATE IF NOT EXISTS 不会删除旧数据。【参考方案2】:

我是这样使用的:

   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; 
    

【讨论】:

以上是关于android sqlite 如果不存在则创建表的主要内容,如果未能解决你的问题,请参考以下文章

插入表,如果表不存在,则创建表然后插入

Laravel 模型 - 如果数据库表不存在则返回 null

Android Sqlite 如果不存在则插入

根据android studio编译器,数据库表不存在

如果表不存在,则插入其他表

MySQL 仅在表不存在时插入数据