繁体   English   中英

如何在现有数据库中添加新表

[英]how to add a new table in existing database

我试图在数据库中添加一个新表,但是每当我运行我的应用程序时,它都会给我一个错误表名不存在,如何添加一个具有 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

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

有关更多信息,请参阅SQLiteOpenHelper onCreate() / onUpgrade() 何时运行?

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

 private static final int DATABASE_VERSION = 2;

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

结果在访问TABLE_ADD_MESSAGE时出现错误。 您可以通过在那里放置一个日志语句来自己验证这一点,您会注意到它没有被执行。

对此的解决方案是@laalto 建议的。 :)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM