あなたが私を助けることができるかどうか疑問に思う。第2のテーブルを追加した後、Android Studioアプリがクラッシュする
ユーザーの詳細を格納しているテーブルが1つあり、新しいユーザーが登録してログインできるようにしています。しかし、後でトランザクションを格納するために新しいテーブルを追加しましたが、2番目のテーブルをまったく同じように追加することはできません。データベースバージョンをアップグレードしようとしましたが、前のgitがコミットされていないことを示します。私は2つのテーブル
public class DBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "user.db";
public static final String TABLE_USER = "user";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ADDRESS1 = "address1";
public static final String COLUMN_ADDRESS2 = "address2";
public static final String COLUMN_ACCNO = "accNo";
public static final String COLUMN_PIN = "PIN";
public static final String COLUMN_BALANCE = "currentbalance";
public static final String TABLE_TRANSACTIONS = "transactions";
public static final String COLUMN_TID = "_tid";
public static final String COLUMN_DESCRIPTION = "description";
public static final String COLUMN_AMOUNT = "amount";
public DBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_USER + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_ADDRESS1 + " TEXT, " +
COLUMN_ADDRESS2 + " TEXT, " +
COLUMN_ACCNO + " INTEGER, " +
COLUMN_PIN + " INTEGER UNIQUE, " +
COLUMN_BALANCE + " INTEGER " +
");";
db.execSQL(query);
String query2 = "CREATE TABLE " + TABLE_TRANSACTIONS + "(" +
COLUMN_TID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_DESCRIPTION + " TEXT, " +
COLUMN_AMOUNT + " INTEGER);";
db.execSQL(query2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TRANSACTIONS);
onCreate(db);
}
//Add new row
public void addUser(User user){
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, user.get_name());
values.put(COLUMN_ADDRESS1, user.get_address1());
values.put(COLUMN_ADDRESS2, user.get_address2());
values.put(COLUMN_ACCNO, user.get_accNo());
values.put(COLUMN_PIN, user.get_PIN());
values.put(COLUMN_BALANCE, user.get_currentbalance());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_USER, null, values);
db.close();
}
public void addTransaction(Transaction transaction){
ContentValues values = new ContentValues();
values.put(COLUMN_DESCRIPTION, transaction.get_description());
values.put(COLUMN_AMOUNT, transaction.get_amount());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_TRANSACTIONS, null, values);
db.close();
}
それは私がここのコンストラクタを持っている「トランザクション」オブジェクトを、取るために私DBhelperに持っているものHERESに
、私はここにゲッター/セッターのコードが含まれていません
04-23 23:33:21.425 18370-18370/marcusobyrne.bankingapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: marcusobyrne.bankingapp, PID: 18370
java.lang.IllegalStateException: Could not find method saveTransaction(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button2'
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
at android.view.View.performClick(View.java:6207)
at android.widget.TextView.performClick(TextView.java:11094)
at android.view.View$PerformClick.run(View.java:23639)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
:ここではそのわずか簡単な
public class Transaction {
private int _id;
private String _description;
private double _amount;
public Transaction(String _description, double _amount) {
this._description = _description;
this._amount = _amount;
}
は、スタックトレースであるため、 INTEGERからREALへ2
private static final int DATABASE_VERSION = 2;
変更COLUMN_AMOUNTに
正確なクラッシュメッセージ/スタックトレースと、既に試した修正を提供してください。 – alzee
@alzee残念なことに私のPCは仮想エミュレータを実行することができず、携帯電話の開発者モード、問題の別の部分で実行しています。( – azamean
電話から実行していてもスタックトレースを取得できます –