【问题标题】:Why SQLite give an error?为什么 SQLite 会报错?
【发布时间】:2017-08-04 01:35:30
【问题描述】:

实际上,它已经工作了,但我添加了 Byte[]img 和 values.put(DB_COLUMN,img)

虽然我已经解决了一些问题,但我无法解决这个问题,我需要你的帮助,谢谢! (我记下了错误。)

我的 SQLITE 数据库类

public class Database extends SQLiteOpenHelper {
private static final String DB_NAME = "Rest Check";
private static final int DB_VER = 1;
public static final String DB_TABLE = "Task";
public static final String DB_COLUMN =  "TaskName";
public Database(Context context) {
    super(context, DB_NAME, null, DB_VER);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String query = String.format("CREATE TABLE %s (ID INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT NOT NULL)", DB_TABLE,DB_COLUMN);
    db.execSQL(query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String query = String.format("DELETE TABLE IF EXISTS &s", DB_TABLE);
    db.execSQL(query);
    onCreate(db);
}

    public void insertNewTask (String task, byte[] img){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DB_COLUMN,task);
        values.put(DB_COLUMN, img);
        db.insertWithOnConflict(DB_TABLE,null,values, SQLiteDatabase.CONFLICT_REPLACE);
        db.close();
    }

public void deleteTask(String task){
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(DB_TABLE,DB_COLUMN + " = ?",new String[]{task});
    db.close();
}

public ArrayList<String> getTaskList(){
    ArrayList<String> taskList = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(DB_TABLE,new String[]{DB_COLUMN},null,null,null,null,null);
    while(cursor.moveToNext()){
        int index = cursor.getColumnIndex(DB_COLUMN);
 ///////////// ERROR LINE /////////////
        taskList.add(cursor.getString(index));  
///////////// ERROR LINE /////////////


    }
    cursor.close();
    db.close();
    return taskList;
}

public Cursor getData (String sql){
    SQLiteDatabase database = getReadableDatabase();
    return database.rawQuery(sql, null);

}}

我的第一个活动(由于与 SQLite 数据库有关,此部分给出错误)

 private void loadTaskList() {
/// ERROR LINE ///
    ArrayList<String> taskList = dbHelper.getTaskList();
/// ERROR LINE ///
    if (mAdapter == null) {
        mAdapter = new ArrayAdapter<String>(this, R.layout.row, R.id.task_title, taskList);
       /// mAdapter = new ArrayAdapter<ImageView>(this, R.layout.row, R.id.image6, taskList);
        lstTask1.setAdapter(mAdapter);
    } else {
        mAdapter.clear();
        mAdapter.addAll(taskList);
        mAdapter.notifyDataSetChanged();
    }
}

【问题讨论】:

  • 您可以通过向我们提供正在抛出的异常来帮助我们
  • 顺便说一句,values.put(DB_COLUMN,task); values.put(DB_COLUMN, img); 看起来不对
  • 不,对不起,我应该让自己更清楚 - 请发布您的堆栈跟踪
  • 反正blob不是String,所以不要用getString用getBlob

标签: java android sqlite mobile


【解决方案1】:

从阅读Javadoc for ContentValues 看来,将byte[] 内容放入ContentValues 对象中似乎没有错。但是如果你看看你当前的代码:

ContentValues values = new ContentValues();
values.put(DB_COLUMN, task);
values.put(DB_COLUMN, img);

您会看到您尝试先将一个字符串,然后是一个 blob 放入 same 列。这没有意义,并且由于您的代码在添加 blob 之前运行良好,这意味着 DB_COLUMN 是一个字符列。因此,我建议您将 blob 插入到相应的列中。此外,您的代码中可能还有其他问题,但我的建议有望解决您面临的即时错误。

更新:

如果您的表中没有 BLOB 列,那么您可以创建一个:

CREATE TABLE Task (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    TaskName TEXT NOT NULL,
    newimage BLOB
)

然后您的插入代码将是:

ContentValues values = new ContentValues();
values.put(DB_COLUMN, task);
values.put("newimage", img);

【讨论】:

  • 我很困惑。如果您的表没有 BLOB 列,那么您认为您在哪里插入 BLOB 数据?
  • String query = String.format("CREATE TABLE %s (ID INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT NOT NULL)", DB_TABLE,DB_COLUMN); - 在这里看不到斑点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多