【问题标题】:SQLite Data insertion error Android studioSQLite 数据插入错误 Android studio
【发布时间】:2018-02-05 03:47:22
【问题描述】:

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

 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)时,它工作正常。但是当我制作多于两列时,“未插入”消息来了。我找不到错误在哪里。请帮助

【问题讨论】:

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


    【解决方案1】:

    猜测原因是传递给通过et.getText().toString() 检索的addtotable 方法的文本不是有效的整数,因此无法满足rowid 值的特殊约束:-

    在 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 应该这样做,或者您可以删除应用程序的数据或卸载应用程序,后两者删除数据库并因此运行 onCreate 方法。

    您或许应该查看您对 id 列的要求。通常,id 列用于唯一标识一行,并且对于用户来说通常没有什么价值。

    【讨论】:

    • 评论你说的那句话很有帮助。你能告诉我为什么会这样吗?
    • @MdAhmedAkash 因为 ?? INTEGER PRIMARY KEY 很特别? (其中 ?? 是一个有效的列名)是一个特殊索引(rowid)的别名,为了提高效率必须是一个整数。因此,该行将失败该特殊约束。不提供值可以让 SQlite 计算出一个唯一的整数值,这就是 rowid 的设计目的。您可以覆盖 SQLite 并提供一个值,但它必须是一个整数。虽然很特别,但也很常见,也很有用。
    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多