繁体   English   中英

在SQL Java for Android中的表中添加列

[英]Adding a column to a table in sql java for android

我试图将列添加到我创建的sql数据库中。 该数据库用于学习紫色,因此请忽略列名..尝试这样做时遇到很多问题,但是经过大量阅读后,我看到了几样东西:1.我需要更改数据库版本,以便启动onUpgrade方法2。我需要在onUpgrade方法中添加“ ALTER TABLE”命令。

这样做之后,该应用程序停止引发异常,我认为一切都很好。 唯一的问题是,如果我尝试使用新列更新表,则不会更新任何内容(即使由于某种原因它也不会引发异常)。

我主要关心的是我是否应该将值得推荐的新列添加到onCreat上,或者我创建的onUpdate方法是否不是要添加KEY_KIDS列:

public void onUpgrade(SQLiteDatabase db, int oldVersion,
            int newVersion) throws SQLException{
        Log.w(DBHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        db.execSQL("ALTER TABLE " + DATABASE_TABLE[0] +  " ADD COLUMN "
                +  KEY_KIDS + " text not null default kids; ");
        Log.w(DBHelper.class.getName(),
                "Columns added!");
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[0]);
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[1]);
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[2]);
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[3]);
        onCreate(db);
    }

这是我希望向其添加列的表,新列为KEY_KIDS:

 public static final String Table1= "CREATE TABLE " + DATABASE_TABLE[0] + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL, " + 
                KEY_AGE + " TEXT NOT NULL, " +
                KEY_HOTNESS + " TEXT NOT NULL);" ; //

应该是这样,还是带有KEY_KIDS声明(KEY_KIDS +“ TEXT NOT ..”)

请帮助。 几天来我一直在努力解决我的问题,无法解决。 这是sql的整个代码:

     package com.Dvir.newlearning1;

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.SQLiteOpenHelper;
import android.util.Log;

public class HotOrNot {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "persons_name";
    public static final String KEY_AGE = "persons_age";
    public static final String KEY_HOTNESS = "persons_hotness";
    public static final String KEY_Hairy = "is_hairy";
    public static final String KEY_KIDS = "has_kids";

    private static final String DATABASE_NAME = "NewDB2";
    private static final String[] DATABASE_TABLE = {"peopleTable", 
            "peopleTable2", "peopleTable3","peopleTable4" };
    private static final int DATABASE_VERSION = 2;

    private DBHelper ourHelper;
    private final Context ourContext;
    private SQLiteDatabase ourDatabase;

    private static class DBHelper extends SQLiteOpenHelper{
        public static final String Table1= "CREATE TABLE " + DATABASE_TABLE[0] + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL, " + 
                KEY_AGE + " TEXT NOT NULL, " +
                KEY_HOTNESS + " TEXT NOT NULL " + 
                KEY_KIDS + " TEXT NOT NULL);" ;
        public static final String Table2 = "CREATE TABLE " + DATABASE_TABLE[1] + " (" +
                    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_NAME + " TEXT NOT NULL, " + 
                    KEY_AGE + " TEXT NOT NULL, " +
                    KEY_HOTNESS + " TEXT NOT NULL);";
        public static final String Table3= "CREATE TABLE " + DATABASE_TABLE[2] + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL, " + 
                KEY_AGE + " TEXT NOT NULL, " +
                KEY_HOTNESS + " TEXT NOT NULL);" ;
        public static final String Table4= "CREATE TABLE " + DATABASE_TABLE[3] + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL, " + 
                KEY_AGE + " TEXT NOT NULL, " +
                KEY_HOTNESS + " TEXT NOT NULL);" ;
        public DBHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) throws SQLException{
            // TODO Auto-generated method stub
            db.execSQL(Table1);
            db.execSQL(Table2);
            db.execSQL(Table3);
            db.execSQL(Table4);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,
                int newVersion) throws SQLException{
            Log.w(DBHelper.class.getName(),
                    "Upgrading database from version " + oldVersion + " to "
                            + newVersion + ", which will destroy all old data");
            /*db.execSQL("ALTER TABLE " + DATABASE_TABLE[0] +  " ADD COLUMN "
                    +  KEY_KIDS + " text not null default kids; ");*/
            Log.w(DBHelper.class.getName(),
                    "Columns added!");
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[0]);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[1]);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[2]);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE[3]);
            onCreate(db);
        }

    }

    public HotOrNot(Context c) throws SQLException{
        ourContext = c;
    }
    public HotOrNot open(){
        ourHelper = new DBHelper(ourContext);
        ourDatabase = ourHelper.getWritableDatabase();
        return this;
    }
    public void close(){
        ourHelper.close();

    }
    public long creatEntry(String name, String age, String hotness, int table, String kids)
        throws SQLException {
        // TODO Auto-generated method stub
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME,name);
        cv.put(KEY_AGE, age);
        cv.put(KEY_HOTNESS, hotness);
        cv.put(KEY_KIDS, kids);
        return ourDatabase.insert(DATABASE_TABLE[table], null, cv);
    }
    public long creatEntry(String name, String age, String hotness,String hasKids, int table) {
        // TODO Auto-generated method stub
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME,name);
        cv.put(KEY_AGE, age);
        cv.put(KEY_HOTNESS, hotness);
        cv.put(KEY_KIDS, hotness);
        return ourDatabase.insert(DATABASE_TABLE[table], null, cv);
    }
    public String getData(int table) {
        // TODO Auto-generated method stub
        String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS, KEY_AGE};
        Cursor c;
        c = ourDatabase.query(DATABASE_TABLE[table], columns, null, null, null, null, null);
        String result = "";
        int iRow = c.getColumnIndex(KEY_ROWID);
        int iName = c.getColumnIndex(KEY_NAME);
        int iAge = c.getColumnIndex(KEY_AGE);
        int iHotness = c.getColumnIndex(KEY_HOTNESS);

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
            result = result + c.getString(iRow) + " " + c.getString(iName) + " " +
                    c.getString(iAge) + " " + c.getString(iHotness) + "\n";
        }

        return result;
    }
    public String getName(long l) throws SQLException{
        // TODO Auto-generated method stub
        String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS, KEY_AGE};
        Cursor c = ourDatabase.query(DATABASE_TABLE[0], columns, KEY_ROWID + "=" + l, null, null,null, null);
        if (c !=null){
            c.moveToFirst();
            String name = c.getString(1);
            return name;
        }
        return null;
    }
    public String getHotness(long l) throws SQLException{
        // TODO Auto-generated method stub
        String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS, KEY_AGE};
        Cursor c = ourDatabase.query(DATABASE_TABLE[0], columns, KEY_ROWID + "=" + l, null, null,null, null);
        if (c !=null){
            c.moveToFirst();
            int iHot = c.getColumnIndex(KEY_HOTNESS);
            String name = c.getString(iHot);
            return name;
        }
        return null;
    }
    public String getAge(long l)throws SQLException {
        // TODO Auto-generated method stub
        String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS, KEY_AGE};
        Cursor c = ourDatabase.query(DATABASE_TABLE[0], columns, KEY_ROWID + "=" + l, null, null,null, null);
        if (c !=null){
            c.moveToFirst();
            int iAge = c.getColumnIndex(KEY_AGE);
            String name = c.getString(iAge);
            return name;
        }
        return null;
    }
    public void updateEntry(int table, long lRow, String mHotness, String mAge,
            String mName) throws SQLException {
        // TODO Auto-generated method stub
        ContentValues cvUpdate = new ContentValues();
        cvUpdate.put(KEY_NAME, mName);
        cvUpdate.put(KEY_AGE, mAge);
        cvUpdate.put(KEY_HOTNESS, mHotness);
        ourDatabase.update(DATABASE_TABLE[table], cvUpdate, KEY_ROWID + "=" + lRow, null);

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

    }
}

另一件事-我一直在尝试使用for循环创建多表数据库。 但是,我不知道为什么,它不允许我这样做。 它尝试做类似的事情:String [] table; for(int i = 0; i <26,i ++){table [i] =“ CREATE TABLE” +“ DATABASE_TABLE [i]” + ...}蚀使红色标记在“ table”末尾用错误:令牌“;”上的语法错误,{预期在此令牌后有人知道为什么吗?

onUpgrade函数可完成三件事:

  1. 它添加了kids列;
  2. 它从数据库中删除所有表;
  3. 它调用onCreate ,它将创建全新的表。

onUpgrade函数的目的是将数据库从旧版本转换为新版本。 只是删除旧数据库,然后重新创建它可能是执行此操作的有效方法(如果您不关心数据),但是您无需费心更改。

删除步骤2和3。

onCreate函数必须创建最新版本的数据库,因此它必须包括该版本的所有列。

看这部分:

public static final String Table1= "CREATE TABLE " + DATABASE_TABLE[0] + " (" +
            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            KEY_NAME + " TEXT NOT NULL, " + 
            KEY_AGE + " TEXT NOT NULL, " +
            KEY_HOTNESS + " TEXT NOT NULL " + 
            KEY_KIDS + " TEXT NOT NULL);" ;

您忘记了KEY_KIDS部分之前的逗号( , )。

编辑线

db.execSQL("ALTER TABLE " + DATABASE_TABLE[0] +  " ADD COLUMN "
+  KEY_KIDS + " text not null default kids; ");

db.execSQL("ALTER TABLE " + DATABASE_TABLE[0] +  " ADD COLUMN "
+  KEY_KIDS + " text not null default 'kids'; ");

注意单引号“孩子”。 如果column是字符串类型(例如:text,varchar,char),请用引号引起来,除非数字类型的数据类型(例如:integer,decimal)不需要引号。

暂无
暂无

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

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