我的简单帐簿代码存在一些问题。
我想在点击保存按钮时插入一行。
我检查了我的表格已成功创建。
save.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mDbOpenHelper.open();
try{
mDbOpenHelper.insertColumn(
rButton,
mEditTexts[1].getText().toString().trim(),
spinnerSelected,
mEditTexts[0].getText().toString().trim());
}catch(Exception e){
Log.d("TAG","error");
}
mDbOpenHelper.close();
mCursor.close();
}
});
insertColumn()
// Insert DB
public long insertColumn(String cashORcard, String amount, String category, String detail){
mDB = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Database.CreateDB.CASH, cashORcard);
values.put(Database.CreateDB.AMOUNT, amount);
values.put(Database.CreateDB.CATEGORY, category);
values.put(Database.CreateDB.DETAIL, detail);
return mDB.insert(Database.CreateDB.TABLENAME, null, values);
}
定义我的数据库表
public class Database {
public static final class CreateDB implements BaseColumns{
public static String firstCash="0";
public static String firstAccount="0";
public static String allMoney="0";
public static final String CASH="cash";
public static final String CATEGORY="category";
public static final String DETAIL="detail";
public static final String AMOUNT="0";
public static final String ID="0";
public static final String TABLENAME="Accountbook";
public static final String CREATE=
"CREATE TABLE "+TABLENAME
+" ( _id integer primary key autoincrement, "
+" CASH text not null , "
+" AMOUNT text not null , "
+" CATEGORY text not null , "
+" DETAIL text , "
+" firstCash text not null , "
+" firstAccount text not null , "
+" allMoney text not null );";
}
}
日志
04-17 02:53:11.471: E/SQLiteLog(877): (1) near "0": syntax error
04-17 02:53:11.501: E/SQLiteDatabase(877): Error inserting cash=cash detail=asdf category=salary 0=567
04-17 02:53:11.501: E/SQLiteDatabase(877): android.database.sqlite.SQLiteException: near "0": syntax error (code 1): , while compiling: INSERT INTO Accountbook(cash,detail,category,0) VALUES (?,?,?,?)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
04-17 02:53:11.501: E/SQLiteDatabase(877): at com.android.accountbook_edit.DbOpenHelper.insertColumn(DbOpenHelper.java:82)
04-17 02:53:11.501: E/SQLiteDatabase(877): at com.android.accountbook_edit.Income$3.onClick(Income.java:99)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.view.View.performClick(View.java:4204)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.view.View$PerformClick.run(View.java:17355)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.os.Handler.handleCallback(Handler.java:725)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.os.Handler.dispatchMessage(Handler.java:92)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.os.Looper.loop(Looper.java:137)
04-17 02:53:11.501: E/SQLiteDatabase(877): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-17 02:53:11.501: E/SQLiteDatabase(877): at java.lang.reflect.Method.invokeNative(Native Method)
04-17 02:53:11.501: E/SQLiteDatabase(877): at java.lang.reflect.Method.invoke(Method.java:511)
04-17 02:53:11.501: E/SQLiteDatabase(877): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-17 02:53:11.501: E/SQLiteDatabase(877): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-17 02:53:11.501: E/SQLiteDatabase(877): at dalvik.system.NativeStart.main(Native Method)
需要更多代码,请告诉我! 谢谢!
答案 0 :(得分:1)
首先,您要插入行而非列。
然后,日志中的错误非常清楚
android.database.sqlite.SQLiteException: near "0": ... INSERT INTO Accountbook(cash,detail,category,0) VALUES (?,?,?,?) ...
您试图将值插入无效的列名称: 0
答案 1 :(得分:0)
public static final String AMOUNT="0"
这应该是
public static final String AMOUNT="AMOUNT"
您尝试插入名为“0”
的列的结果答案 2 :(得分:0)
请参阅错误0=567
。您的列名称位于integer
类型中。所以这是错误的。 Colomn名称应该有效。所以,试试以下
public static final String CREATE=
"CREATE TABLE "+TABLENAME
+" (_id integer primary key autoincrement, "
+ CASH +" text not null , "
+ AMOUNT+" text not null , "
+ CATEGORY+" text not null , "
+ DETAIL+" text , "
+ firstCash+" text not null , "
+ firstAccount+" text not null , "
+ allMoney+" text not null );";
而不是这个
public static final String CREATE=
"CREATE TABLE "+TABLENAME
+" ( _id integer primary key autoincrement, "
+" CASH text not null , "
+" AMOUNT text not null , "
+" CATEGORY text not null , "
+" DETAIL text , "
+" firstCash text not null , "
+" firstAccount text not null , "
+" allMoney text not null );";
同时更改
firstCash,firstAccount,allMoney,AMOUNT varibales values to be valid string.
像
public static String firstCash="firstCash";
public static String firstAccount="firstAccount";
public static String allMoney="allMoney";
public static final String AMOUNT="AMOUNT";
为什么因为列名应该有效。
我希望这会对你有所帮助。
答案 3 :(得分:0)
您已将mEditTexts[0].getText().toString().trim()
的值传递给字符串详细信息。检查字符串详细信息的值和ID Database.CreateDB.DETAIL
。如果它显示“0”那么它应该是“细节”。
答案 4 :(得分:0)
尝试更改插入查询,如下所示:
您还需要传递其他剩余列firstCash,firstAccount,allMoney
值,因为在您的创建表查询中,您已将其属性定义为NOT NULL。
public long insertColumn(String cashORcard, String amount, String category, String detail,String cashValue,String AccountVal,String money){ mDB = mDBHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(Database.CreateDB.CASH, cashORcard); values.put(Database.CreateDB.AMOUNT, amount); values.put(Database.CreateDB.CATEGORY, category); values.put(Database.CreateDB.DETAIL, detail); values.put(Database.CreateDB.firstCash, cashValue); values.put(Database.CreateDB.firstAccount, AccountVal); values.put(Database.CreateDB.allMoney, money); return mDB.insert(Database.CreateDB.TABLENAME, null, values); }