SQLite数据插入错误Android工作室

时间:2018-02-04 18:17:28

标签: sqlite android-studio-3.0 android-database

这是我的活动类。当我按下数据按钮时,数据应插入数据库。但每次“未插入”时都会出现

 my = new DatabaseHandler(this);
        data=(Button)findViewById(R.id.data);

        data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time=clockTimeTextView.getText().toString();
                repeat=Repeat_optionTextview.getText().toString();
                ringtone=Ringtone_optionTextview.getText().toString();
                if(chkBox.isChecked()){
                    vibrate="true";
                }else{
                    vibrate="false";
                }
                method=Method_optionTextview.getText().toString();

                //Toast.makeText(getApplicationContext(),method + ringtone ,Toast.LENGTH_LONG).show();

                boolean checkers = my.addtotable(et.getText().toString(),time,repeat,ringtone,vibrate,method);
                if (checkers == true) {
                    Toast.makeText(AddAlarmActivity.this, "Successfully Inserted", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(AddAlarmActivity.this, "Not Inserted", Toast.LENGTH_LONG).show();
                }

            }
        });

这是DatabaseHandler类

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class DatabaseHandler extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "database5.db";
    private static final String TABLE_NAME = "mytable10";
    private static final String COLUMN1 = "ID";
    private static final String COLUMN2 = "TIME";
    private static final String COLUMN3 = "REPEAT";
    private static final String COLUMN4 = "RINGTONE";
    private static final String COLUMN5 = "VIBRATE";
    private static final String COLUMN6 = "METHOD";



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


    @Override
    public void onCreate(SQLiteDatabase db) {

        String query;
        query = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN1 + "  INTEGER PRIMARY KEY , "
                                                   + COLUMN2 + " TEXT , "
                                                   + COLUMN3 + " TEXT , "
                                                   + COLUMN4 + " TEXT , "
                                                   + COLUMN5 + " TEXT , "
                                                   + COLUMN6 + "TEXT " + ")";
        db.execSQL(query);

    }

    @Override


    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL(" DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }


    public boolean addtotable(String id, String time, String repeat, String ringtone,String vibrate,String method) {

        SQLiteDatabase sqLiteDatabase = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN1, id);
        contentValues.put(COLUMN2, time);
        contentValues.put(COLUMN3, repeat);
        contentValues.put(COLUMN4, ringtone);
        contentValues.put(COLUMN5, vibrate);
        contentValues.put(COLUMN6, method);

        long checker = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
        if (checker == -1) {
            return false;
        } else {
            return true;
        }
    }

    public Cursor display() {

        SQLiteDatabase sqLiteDatabase = getReadableDatabase();
        Cursor res;
        res = sqLiteDatabase.rawQuery("SELECT * FROM " + TABLE_NAME, null);
        return res;
    }
}

当我制作两个列(column_1& column_2)时,它工作正常。但是当我制作两个以上的列“未插入”消息时,我找不到错误的位置。请帮助

1 个答案:

答案 0 :(得分:0)

猜测原因是传递给通过addtotable检索的et.getText().toString()方法的文本不是有效整数,因此根据以下内容失败了rowid值的特殊约束: - < / p>

  

在SQLite中,类型为INTEGER PRIMARY KEY的列是其中的别名   ROWID(除非在WITHOUT ROWID表中),它总是64位签名   整数。 SQLite Autoincrement

  • 注意一个有效的整数,如果该值是一个字符串,则无关紧要,例如1,2,3 ...... 9223372036854775807因为SQLite会相应地转换它。

我建议最简单的解决方法是注释掉或删除该行: -

    contentValues.put(COLUMN1, id);

另一种解决方案是确保从看似EditText的内容中检索的值是一个整数。但是我不认为这对用户界面有好处。

另一种方法是更改​​列,使其不是rowid的别名,可能通过将TEXT指定为列类型甚至是INT PRIMARY KEY(请注意,您必须删除表并重新定义它。增加数据库版本number应该这样做,或者你可以删除App的数据或卸载App,后两个删除数据库,因此运行onCreate方法。)

您应该查看id列的要求。通常,id列用于唯一标识行,如果对用户有任何价值,则通常很少。