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 (ネイティブ メソッド) で
編集* **
アプリのアンインストール/再インストールを試み、アプリのデータの消去も試みましたが、どちらも機能しません。