0

SQL Lite オープン ヘルパーを拡張するデータ ハンドラー クラスを使用してデータベースを作成しています。例をコピーしましたが、この例には ID、名前、スキルの 3 つの列しかありませんでした。強さ、忠誠心、武器の 3 つの列を追加したいと考えています。コードは 3 つの列で動作しますが、さらに 3 つの列を追加するとすぐに動作せず、データベースの作成時に新しい列が見つからないと表示されます。私が使用しているコードは次のとおりです..

public class DatabaseHandler extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "Cards.db";

private static final String TABLE_NAME = "card";

private static final String COL_ID = "id";

private static final String COL_NAME = "name";

private static final String COL_SKILL = "skill";

private static final String COL_STRENGTH = "strength";

private static final String COL_LOYALTY = "loyalty";

private static final String COL_WEAPON = "weapon";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
            + COL_ID + " INTEGER PRIMARY KEY," + COL_NAME + " TEXT,"
            + COL_SKILL + " TEXT" + 
            COL_STRENGTH + "TEXT" 
            + COL_LOYALTY + "TEXT" + COL_WEAPON + "TEXT"+
            ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldNum, int newNum) {
    // Drop older table if exist and create fresh
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public void addCard(Card card) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL_ID, card.getID());
    values.put(COL_NAME, card.getName());
    values.put(COL_SKILL, card.getSkill());
    values.put(COL_STRENGTH, card.getStrength());
    values.put(COL_LOYALTY, card.getLoyalty());
    values.put(COL_WEAPON, card.getWeapon());
    db.insert(TABLE_NAME, null, values);
    db.close();
}

public List<Card> getAll() {
    List<Card> list = new ArrayList<Card>();
    String selectQuery = "SELECT  * FROM " + TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            Card card = new Card(cursor.getInt(0),
                    cursor.getString(1), cursor.getString(2))
                    cursor.getString(3), cursor.getString(4),
                    cursor.getString(5)
                    );
            list.add(card);
        } while (cursor.moveToNext());
    }
    return list;
}

public void removeAll() {
    SQLiteDatabase db = this.getWritableDatabase();
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public void deleteCard(Card card) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, COL_ID + " = ?",
            new String[] { String.valueOf(card.getID()) });
    db.close();
}

public int updateCard(Card card) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL_NAME, card.getName());
    values.put(COL_SKILL, card.getSkill());
    values.put(COL_STRENGTH, card.getStrength());
    values.put(COL_LOYALTY, card.getLoyalty());
    values.put(COL_WEAPON, card.getWeapon());
    return db.update(TABLE_NAME, values, COL_ID + " = ?",
            new String[] { String.valueOf(card.getID()) });
}

public Card getCard(int id) {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_NAME, new String[] { COL_ID, COL_NAME,
            COL_SKILL, 
            COL_STRENGTH, COL_LOYALTY, COL_WEAPON 
            }, COL_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
    }
    Card card = new Card(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2),
            cursor.getString(3), cursor.getString(4),
            cursor.getString(5)
            );
    return card;
}

}

挿入しようとしている他の列がいつ気に入らないのかわかりません。

次のようなカードクラスもありました。

パブリック クラス カード {

private int ID;

private String name;

private String skill;

private String strength; 

private String loyalty; 

private String weapon;


public Card(int ID, String name, String skill, String strength, String loyalty, String weapon) {
    this.ID = ID;
    this.name = name;
    this.strength = skill;
    this.skill = strength;
    this.loyalty = loyalty;
    this.weapon = weapon;
}

public String getName(){
    return this.name;
}

public void setName(String name){
    this.name = name;
}

public String getSkill(){
    return this.skill;
}

public void setSkill(String skill){
    this.skill = skill;
}

public String getStrength() {
    return this.strength;
}

public void setStrength(String strength) {
    this.strength = strength;
}

public String getLoyalty() {
    return this.loyalty;
}

public void setLoyalty(String loyalty) {
    this.loyalty = loyalty;
}

public String getWeapon() {
    return this.weapon;
}

public void setWeapon(String weapon) {
    this.weapon = weapon;
}

public int getID() {
    return ID;
}

public void setID(int iD) {
    ID = iD;
}

}

現時点では、ブラウズ クラスのログに書き込むことで、データベースの動作をテストしています。ここで使用しているコードは .

public class Browse extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout2);
    DatabaseHandler dh = new DatabaseHandler(this);

    Log.d("Database: ", "Dropping old table");
    dh.removeAll();

    Log.d("Database: ", "Inserting values..");
    dh.addCard(new Card(1, "Trevor", "11", "22", "33", "44"));
    dh.addCard(new Card(2, "Joseph", "49", "65", "87", "12"));
    dh.addCard(new Card(3, "Paul", "87", "12", "90", "01"));
    dh.addCard(new Card(4, "Mary", "30", "43", "12", "98"));

    Log.d("Database: ", "Listing all cards..");
    List<Card> list = dh.getAll();  
    for (Card lr : list) {
        String log = "ID:" + lr.getID() +" Name: " + lr.getName() + " Phone: " + lr.getSkill() + " Strength " + lr.getStrength()
                + " Loyalty: " + lr.getLoyalty() + " Weapon: " + lr.getWeapon();
        Log.d("Database: ", log); 
    }

    dh.deleteCard(new Card(1, "Trevor", "11", "22", "33", "44"));

    dh.updateCard(new Card(2, "Joseph", "36", "27", "87", "11"));

    Log.d("Database: ", "Re-listing all cards..");
    list = dh.getAll();
    for (Card lr : list) {
        String log = "ID:" + lr.getID() +" Name: " + lr.getName() + " Skill: " + lr.getSkill() + " Strength: " +lr.getStrength()
                + " Loyalty: " + lr.getLoyalty() + " Weapon: " + lr.getWeapon();
        Log.d("Database: ", log); 
    }

    Card retrieved = dh.getCard(3);
    Log.d("Database: ", "SINGLE: " + retrieved.getName());
}

}

他の列を追加しない理由を知っている人はいますか? 助けてくれてありがとう。

編集**

私はすべてのコードを使用しています。アプリケーションを実行すると、Log Cat に次のように表示されます

11-30 12:44:19.193: I/Database(364): sqlite が返されました: エラー コード = 1、msg = テーブル カードに忠誠という名前の列がありません

11-30 12:44:19.213: E/Database(364): id=1 忠誠度=33 スキル=11 強さ=22 武器=44 名前=トレバーの挿入エラー

11-30 12:44:19.213: E/Database(364): android.database.sqlite.SQLiteException: テーブル カードには忠誠という名前の列がありません: 、コンパイル中: カードに挿入 (id、忠誠、スキル、強さ、武器、 name) VALUES(?, ?, ?, ?, ?, ?);

11-30 12:44:19.213: E/Database(364): android.database.sqlite.SQLiteCompiledSql.native_compile(ネイティブ メソッド) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteCompiledSql.compile (SQLiteCompiledSql.java:91) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:64) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:80) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteStatement で。(SQLiteStatement.java:36)

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteDatabase.compileStatement (SQLiteDatabase.java:1145) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteDatabase.insertWithOnConflict (SQLiteDatabase.java:1536) で

11-30 12:44:19.213: E/データベース (364): android.database.sqlite.SQLiteDatabase.insert (SQLiteDatabase.java:1410) で

11-30 12:44:19.213: E/データベース (364): uk.ac.tees.L1024329.DatabaseHandler.addCard(DatabaseHandler.java:96) で

11-30 12:44:19.213: E/データベース (364): uk.ac.tees.L1024329.Browse.onCreate (Browse.java:22) で

11-30 12:44:19.213: E/データベース (364): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) で

11-30 12:44:19.213: E/データベース (364): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627) で

11-30 12:44:19.213: E/データベース (364): android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679) で

11-30 12:44:19.213: E/データベース(364): android.app.ActivityThread.access$2300(ActivityThread.java:125)

11-30 12:44:19.213: E/データベース (364): android.app.ActivityThread$H.handleMessage (ActivityThread.java:2033) で

11-30 12:44:19.213: E/データベース (364): android.os.Handler.dispatchMessage (Handler.java:99) で

11-30 12:44:19.213: E/データベース(364): android.os.Looper.loop(Looper.java:123)

11-30 12:44:19.213: E/データベース (364): android.app.ActivityThread.main (ActivityThread.java:4627) で

11-30 12:44:19.213: E/Database(364): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で

11-30 12:44:19.213: E/データベース (364): java.lang.reflect.Method.invoke(Method.java:521) で

11-30 12:44:19.213: E/データベース (364): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) で

11-30 12:44:19.213: E/データベース (364): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626) で

11-30 12:44:19.213: E/データベース (364): dalvik.system.NativeStart.main (ネイティブ メソッド) で

編集* **

アプリのアンインストール/再インストールを試み、アプリのデータの消去も試みましたが、どちらも機能しません。

4

3 に答える 3

2

さまざまな列名の間のコンマを見逃しているようです。そのはず

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
            + COL_ID + " INTEGER PRIMARY KEY," + COL_NAME + " TEXT,"
            + COL_SKILL + " TEXT," + 
            COL_STRENGTH + " TEXT, " 
            + COL_LOYALTY + " TEXT, " + COL_WEAPON + " TEXT"+
            ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

お役に立てれば。

更新 また、列名変数と列タイプの間にスペースを入れていないため、上記の修正されたコードのように、TEXT という単語の前にスペースを入れる必要があります。

于 2012-11-30T14:46:56.593 に答える
1

私は完全に実行されているコードを持っています。使用ごとに変更してみることができます。

public class Database {

    static final String TAG="database";


    static final String DATABASE_NAME="YourDataBaseName";


    static final int DATABASE_VERSION=1;


    static final String DATABASE_COLLECT_TABLE="YourTableName1";
    static final String DATABASE_FOLLOWUP_TABLE="YourTableName2";



    static final String LeadNo="LeadNo";


    static final String Name="Name";


    static final String Process="Process";


    static final String NextAptDate="NextAptDate";


    static final String Time="Time";


    static final String ChequeNo="ChequeNo";


    static final String ChequeDate="ChequeDate";


    static final String Amount="Amount";


    static final String Bank="Bank";


    static final String Status="Status";


    static final String Remarks="Remarks";


    static final String id="ID";


    static final String CREATE_COLLECT_TABLE= "CREATE TABLE " + DATABASE_COLLECT_TABLE + "("
            + id + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LeadNo + " TEXT NOT NULL, " + Name + " TEXT NOT NULL, "
            + Process + " TEXT NOT NULL, " + ChequeNo + " TEXT NOT NULL, " + ChequeDate + " TEXT NOT NULL, "
            + Amount + " TEXT NOT NULL, "+ Bank + " TEXT NOT NULL, "+ Status + " TEXT NOT NULL, "+ Remarks +" TEXT NOT NULL)";

    static final String CREATE_FOLLOWUP_TABLE= "CREATE TABLE " + DATABASE_FOLLOWUP_TABLE + " ("
            + id + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
            + LeadNo + " TEXT NOT NULL, " 
            + Name + " TEXT NOT NULL, "
            + Process + " TEXT NOT NULL, " 
            + NextAptDate + " TEXT NOT NULL, " 
            + Time + " TEXT NOT NULL, "
            + Status + " TEXT NOT NULL, "
            + Remarks +" TEXT NOT NULL)";


    private final Context ctx;


    private DatabaseHelper dbHelper;


    private SQLiteDatabase sqlDB;


    private class DatabaseHelper extends SQLiteOpenHelper
    {


        public DatabaseHelper(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
            Log.i(TAG, "Creating Collect Database :-"+CREATE_COLLECT_TABLE);
            Log.i(TAG, "Creating FollowUp Database :-"+CREATE_FOLLOWUP_TABLE);

            db.execSQL(CREATE_COLLECT_TABLE);
            db.execSQL(CREATE_FOLLOWUP_TABLE);
        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            Log.w(TAG, "Upgrading Database from version "+ oldVersion + " to " + newVersion);
        }

    }


    public Database(Context context)
    {
        ctx=context;
    }

    public Database open() throws SQLException
    {
        dbHelper=new DatabaseHelper(ctx);
        sqlDB=dbHelper.getWritableDatabase();
        return this;
    }


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



    public long createCollect(String LeadNo,String Name,String Process,
            String ChequeNo,String ChequeDate,String Amount,
            String Bank,String Status,String Remarks)
    {
        ContentValues initialValues=new ContentValues();
        initialValues.put("LeadNo", LeadNo);
        initialValues.put("Name", Name);
        initialValues.put("Process", Process);
        initialValues.put("ChequeNo", ChequeNo);
        initialValues.put("ChequeDate", ChequeDate);
        initialValues.put("Amount", Amount);
        initialValues.put("Bank", Bank);
        initialValues.put("Status", Status);
        initialValues.put("Remarks", Remarks);

        //Checking Values
        Log.i("LeadNo", LeadNo);
        Log.i("Name", Name);
        Log.i("Process", Process);
        Log.i("ChequeNo", ChequeNo);
        Log.i("ChequeDate", ChequeDate);
        Log.i("Amount", Amount);
        Log.i("Bank", Bank);
        Log.i("Status", Status);
        Log.i("Remarks", Remarks);

        return sqlDB.insert(DATABASE_COLLECT_TABLE, null, initialValues);
    }


    public long createFollowUp(String LeadNo,String Name,String Process,
            String NextAptDate,String Time,String Status,String Remarks)
    {
        ContentValues values=new ContentValues();
        values.put("LeadNo", LeadNo);
        values.put("Name", Name);
        values.put("Process", Process);
        values.put("NextAptDate", NextAptDate);
        values.put("Time", Time);
        values.put("Status", Status);
        values.put("Remarks", Remarks);

        //Checking Values
        Log.i("LeadNo", LeadNo);
        Log.i("Name", Name);
        Log.i("Process", Process);
        Log.i("NextAptDate", NextAptDate);
        Log.i("Time", Time);
        Log.i("Status", Status);
        Log.i("Remarks", Remarks);

        return sqlDB.insert(DATABASE_FOLLOWUP_TABLE, null, values);
    }
}
于 2012-11-30T17:24:37.817 に答える
0

私が正しく理解していれば、データベースでテーブルを変更して新しい列を追加するonUpgrade()メソッドを実装するのを忘れたようです...または、アプリをまだリリースしていない場合は、データをクリアしてonUpgrade()を実装せずに再試行してください...データベースは既に古い列セットで作成されており、データベースのバージョン番号を更新するまで新しい列は作成されません (これによりonUpgrade()がトリガーされます) メソッド呼び出し.

于 2012-11-30T14:45:23.583 に答える