【问题标题】:how to add a new table in existing database如何在现有数据库中添加新表
【发布时间】:2021-06-29 23:19:40
【问题描述】:

我试图在数据库中添加一个新表,但是每当我运行我的应用程序时,它都会给我一个错误表名不存在,如何添加一个具有 samoe 字段和函数以从用户那里获取数据的表,即他写在活动的编辑文本中。

   package com.example.smscampaign;

    import java.util.ArrayList;
    import java.util.List;

    import org.w3c.dom.Comment;

    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;

    public class DatabaseHelp {

        public static final String KEY_ROWID = "_id";
        public static final String KEY_NAME = "person_name";
        public static final String KEY_SCALE = "scale_person";
        public static final String KEY_CONTACTS = "Contacts_person";
        public static final String KEY_To_ROWID = "_id";
        public static final String KEY_To_NAME = "person_name";
        public static final String KEY_To_SCALE = "scale_person";
        public static final String KEY_To_CONTACTS = "Contacts_person";

        private static final String DATABASE_NAME = "Himani";
        static final String DATABASE_TABLE = "peopleTable";
        private static final String TABLE_ADD_MESSAGE = "Add_Message";
        private static final int DATABASE_VERSION = 1;

        private DbHelper ourHepler;
        private final Context ourContext;
        SQLiteDatabase ourDatabase;

        public class DbHelper extends SQLiteOpenHelper {

            public DbHelper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
                // TODO Auto-generated constructor stub
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
                // TODO Auto-generated method stub
                db.execSQL( "CREATE TABLE " + DATABASE_TABLE + " (" +
                        KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT,  " +
                        KEY_NAME + " TEXT NOT NULL, " +
                        KEY_SCALE + " TEXT NOT NULL ,"  + KEY_CONTACTS + ")"
                        );
                String CREATE_ADD_MESSAGE= "CREATE TABLE " + TABLE_ADD_MESSAGE +
                         "(" + KEY_To_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT,  " +
                         KEY_To_NAME + " TEXT NOT NULL, " +
                         KEY_To_SCALE + " TEXT NOT NULL ,"  + KEY_To_CONTACTS + ")" ;
                                    db.execSQL(CREATE_ADD_MESSAGE);

                }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
                db.execSQL("DROP TABLE IF EXISTS" + DATABASE_TABLE);
                db.execSQL("DROP TABLE IF EXISTS" + TABLE_ADD_MESSAGE);

                onCreate(db);
            }

        }

        public DatabaseHelp(Context c) {
            ourContext = c;
        }

        public DatabaseHelp open() throws SQLException {
            ourHepler = new DbHelper(ourContext);
            ourDatabase = ourHepler.getWritableDatabase();
            return this;
        }

        public void close() {
            ourHepler.close();
        }

        public long entryCreate(String name, String scale, String contacts) {
            // TODO Auto-generated method stub

            ContentValues cv = new ContentValues();
            cv.put(KEY_NAME, name);
            cv.put(KEY_SCALE, scale);
            cv.put(KEY_CONTACTS, contacts);
            return ourDatabase.insert(DATABASE_TABLE, null, cv);

        }

        public long entryCreate1(String name, String scale, String contacts) {
            // TODO Auto-generated method stub

            ContentValues cv = new ContentValues();
            cv.put(KEY_To_NAME, name);
            cv.put(KEY_To_SCALE, scale);
            cv.put(KEY_To_CONTACTS, contacts);
            return ourDatabase.insert(TABLE_ADD_MESSAGE, null, cv);

        }

        public ArrayList<String> getData() {

            String[] col = new String[] { KEY_ROWID, KEY_NAME, KEY_SCALE,
                    KEY_CONTACTS };
            Cursor c = ourDatabase.query(DATABASE_TABLE, col, null, null, null,
                    null, null);
            String run = "";
            int iRow = c.getColumnIndex(KEY_ROWID);
            int iName = c.getColumnIndex(KEY_NAME);
            int iScale = c.getColumnIndex(KEY_SCALE);
            int iMessage = c.getColumnIndex(KEY_CONTACTS);
            ArrayList<String> newList = new ArrayList<String>();
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                newList.add(c.getString(iName));
            }

            return newList;
        }

        public ArrayList<String> getData1() {

            String[] col = new String[] { KEY_To_ROWID, KEY_To_NAME, KEY_To_SCALE,
                    KEY_To_CONTACTS };
            Cursor c = ourDatabase.query(TABLE_ADD_MESSAGE, col, null, null, null,
                    null, null);
            String run = "";
            int iRow = c.getColumnIndex(KEY_To_ROWID);
            int iName = c.getColumnIndex(KEY_To_NAME);
            int iScale = c.getColumnIndex(KEY_To_SCALE);
            int iMessage = c.getColumnIndex(KEY_To_CONTACTS);
            ArrayList<String> newList = new ArrayList<String>();
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                newList.add(c.getString(iName));
            }

            return newList;
        }

        public Cursor fetchChildren(String KEY_) {
            Cursor c = ourDatabase.rawQuery("SELECT * FROM " + DATABASE_TABLE
                    + " WHERE person_name = ?", new String[] { KEY_ });
            return c;
        }

        public Cursor fetchChildren1(String KEY_) {
            Cursor c = ourDatabase.rawQuery("SELECT * FROM " + DATABASE_TABLE
                    + " WHERE person_name = ?", new String[] { KEY_ });
            return c;
        }

        public String getScale(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_ROWID, KEY_NAME, KEY_SCALE,
                    KEY_CONTACTS };
            Cursor c = ourDatabase.query(DATABASE_TABLE, col, KEY_ROWID + "-" + l,
                    null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String scale = c.getString(2);
                return scale;
            }
            return null;
        }

        public String getScale1(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_To_ROWID, KEY_To_NAME, KEY_To_SCALE,
                    KEY_To_CONTACTS };
            Cursor c = ourDatabase.query(TABLE_ADD_MESSAGE, col, KEY_To_ROWID + "-"
                    + l, null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String scale = c.getString(2);
                return scale;
            }
            return null;
        }

        public String getName(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_ROWID, KEY_NAME, KEY_SCALE,
                    KEY_CONTACTS };
            Cursor c = ourDatabase.query(DATABASE_TABLE, col, KEY_ROWID + "-" + l,
                    null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String name = c.getString(1);
                return name;

            }
            return null;
        }

        public String getName1(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_To_ROWID, KEY_To_NAME, KEY_SCALE,
                    KEY_To_CONTACTS };
            Cursor c = ourDatabase.query(TABLE_ADD_MESSAGE, col, KEY_To_ROWID + "-"
                    + l, null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String name = c.getString(1);
                return name;

            }
            return null;
        }

        public String getContacts(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_ROWID, KEY_NAME, KEY_SCALE,
                    KEY_CONTACTS };
            Cursor c = ourDatabase.query(DATABASE_TABLE, col, KEY_ROWID + "-" + l,
                    null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String contacts = c.getString(3);
                return contacts;

            }
            return null;
        }

        public String getContacts1(long l) {
            // TODO Auto-generated method stub
            String[] col = new String[] { KEY_To_ROWID, KEY_To_NAME, KEY_To_SCALE,
                    KEY_To_CONTACTS };
            Cursor c = ourDatabase.query(TABLE_ADD_MESSAGE, col, KEY_To_ROWID + "-"
                    + l, null, null, null, null);

            if (c != null) {
                c.moveToFirst();
                String contacts = c.getString(3);
                return contacts;

            }
            return null;
        }

        public void updateEntry(long lt, String mName, String mScale,
                String mContatcs) {
            // TODO Auto-generated method stub
            ContentValues cvUpdate = new ContentValues();
            cvUpdate.put(KEY_NAME, mName);
            cvUpdate.put(KEY_SCALE, mScale);
            cvUpdate.put(KEY_CONTACTS, mContatcs);
            ourDatabase
                    .update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "-" + lt, null);
        }

        public void updateEntry1(long lt, String mName, String mScale,
                String mContatcs) {
            // TODO Auto-generated method stub
            ContentValues cvUpdate = new ContentValues();
            cvUpdate.put(KEY_To_NAME, mName);
            cvUpdate.put(KEY_To_SCALE, mScale);
            cvUpdate.put(KEY_To_CONTACTS, mContatcs);
            ourDatabase.update(TABLE_ADD_MESSAGE, cvUpdate,
                    KEY_To_ROWID + "-" + lt, null);
        }

        public void deleteEntry1(long ltt) throws SQLException {
            // TODO Auto-generated method stub
            ourDatabase.delete(TABLE_ADD_MESSAGE, KEY_To_ROWID + "=" + ltt, null);

        }

        public void deleteEntry(long ltt) throws SQLException {
            // TODO Auto-generated method stub
            ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + ltt, null);

        }
    }

总是出现这个错误

> 03-19 16:46:52.396: E/AndroidRuntime(10089):
> java.lang.RuntimeException: Unable to start activity
> ComponentInfo{com.example.smscampaign/com.example.smscampaign.Campaign_Details}:
> android.database.sqlite.SQLiteException: no such table: Add_Message
> (code 1): , while compiling: SELECT _id, name, message, Contacts FROM
> Add_Message

【问题讨论】:

标签: android sqlite


【解决方案1】:

增加 DATABASE_VERSION 以便调用您的 onUpgrade()

有关详细信息,请参阅 When is SQLiteOpenHelper onCreate() / onUpgrade() run?

【讨论】:

    【解决方案2】:

    将您的数据库版本更改为 2,然后仅调用 onUpgrade 并执行代码。

     private static final int DATABASE_VERSION = 2;
    

    【讨论】:

      【解决方案3】:

      您的DbHelperonCreate 方法仅在您第一次调用getWritableDatabase()getReadableDatabase() 时被调用一次。这在您创建第一个表 (DATABASE_TABLE) 时已经发生,但现在没有调用,因此您无法创建新表 (TABLE_ADD_MESSAGE)。

      因此,在访问 TABLE_ADD_MESSAGE 时,您会收到错误消息。您可以通过在此处放置一条日志语句来自己验证这一点,您会注意到它没有被执行。

      @laalto 建议解决这个问题。 :)

      【讨论】:

        【解决方案4】:

        如果有其他人不希望在创建新表时删除和重写他们的整个数据库而没有任何内容,则可以覆盖另一种 SQLOpenHelper 方法:onOpen。你可以在那里INSERT TABLE IF NOT EXISTS,它会检查表是否已经存在。否则它将创建一个新的。也许这不是最好的解决方案,但它是唯一一种可以在不破坏数据并在其中创建空表的情况下向数据库添加表的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-09
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 2016-10-21
          • 1970-01-01
          相关资源
          最近更新 更多