2013-04-17 4 views
0

некоторые проблемы с моим простым кодом учетной записи.Android SQLiteDatabase, вставляющая ошибку

Я хочу вставить строку, когда я нажимаю кнопку сохранения.

Я проверил мой стол, созданный успешно.

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

Вы уверены, что хотите вставить столбец в таблицу? Поскольку логика, которую вы написали, предназначена для вставки записей в таблицу, а не для вставки столбца в базу данных. – GrIsHu

+0

Проверьте определение вашей статистики AMOUNT и ID - они должны быть '' amount'' и '' _id', а не '' 0 "'. – 323go

+0

Посмотрите этот ответ ... [это] [1] [1]: http://stackoverflow.com/questions/8291673/how-to-add-new-column-to- android-sqlite-database Надеюсь, что это поможет вам. – AndiM

ответ

0
public static final String AMOUNT="0" 

Это должно быть

public static final String AMOUNT="AMOUNT" 

результат того, что вы пытаетесь вставить в столбец с именем «0»

+1

Могу ли я узнать, что не так с этим ответом? Почему это было проголосовано? – Gunaseelan

+0

Я довольно уверен, что это тот, кто не любит меня и голосует, когда он видит мои сообщения. Случается всякий раз, когда мы публикуем в той же теме. –

1

Прежде всего, вы вставляете строки не колонны.

Тогда ошибка в журнале очень ясно

android.database.sqlite.SQLiteException: near "0": ... INSERT INTO Accountbook(cash,detail,category,0) VALUES (?,?,?,?) ... 

Вы пытаетесь вставить значение в недействительное имя столбца:

+0

Спасибо! я пропустил его T.T – Unice

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"; 

Почему, потому что имена столбцов должны быть действительными.

Надеюсь, это поможет вам.

+0

Thanq! теперь он работает хорошо! – Unice

0

Вы передали значение mEditTexts[0].getText().toString().trim() в строку подробно. Проверьте, что значение строковой детали и ID Database.CreateDB.DETAIL. Если он показывает «0», тогда это будет «подробно».

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); 
    } 
Смежные вопросы