【问题标题】:SQLiteException: table X has no column named YSQLiteException:表 X 没有名为 Y 的列
【发布时间】:2014-08-07 03:14:55
【问题描述】:

我正在尝试将 SQLDatabase 用作 Todo 类的对象(int id、String name、String date、String note)。通过以下代码创建助手后:

package com.example.todoistodo;

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

public class TodoSQLiteHelper extends SQLiteOpenHelper {

    public TodoSQLiteHelper(Context context) {
        // Databse: todos_db, Version: 1
        super(context, "todos_db", null, 1);
    }

    // todos
    //      _id     - key
    //      todo    - todo text
    //      date    - todo date
    //      note    - todo note

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Execute create table SQL
        db.execSQL("CREATE TABLE todos (_id INTEGER PRIMARY KEY AUTOINCREMENT , todo TEXT NOT NULL , date TEXT NOT NULL , note TEXT NOT NULL);");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
        db.execSQL("DROP TABLE IF EXISTS todos");
        onCreate(db);
    }

}

..并创建对象以查询数据库:

package com.example.todoistodo;

import java.util.ArrayList;
import java.util.List;

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

public class TodoDAO {

    private SQLiteDatabase db;
    private TodoSQLiteHelper dbHelper;

    public TodoDAO(Context context) {
        dbHelper = new TodoSQLiteHelper(context);
        db = dbHelper.getWritableDatabase();
    }

    public void close() {
        db.close();
    }

    public void createTodo(String todoName, String todoDate, String todoNote) {
        ContentValues contentValues = new ContentValues();
        contentValues.put("todo", todoName);
        contentValues.put("date", todoDate);
        contentValues.put("note", todoNote);
        db.insert("todos", null, contentValues); //lane 30
    }

    public void deleteTodo(int todoId) {
        db.delete("todos", "_id = " + todoId, null);
    }

    //get every single Todo
    public List<Todo> getTodos() {
        List<Todo> todoList = new ArrayList<Todo>();

        String[] tableColumns = new String[] {"_id","todo","date","note"};

        Cursor cursor = db.query("todos", null, null, null, null, null, null); // null as second param instead of tableColumns
        cursor.moveToFirst();

        while (!cursor.isAfterLast()) {
            Todo todo = new Todo();

            todo.setId(cursor.getInt(0));
            todo.setName(cursor.getString(1));
            todo.setDate(cursor.getString(2));
            todo.setNote(cursor.getString(3));

            todoList.add(todo);

            cursor.moveToNext();
        }

        return todoList;
    }

}

我在 db.insert("todos", null, contentValues); 中得到一个 SQLiteException createTodo 方法。 我的代码有什么问题? 以下是相关日志:

08-06 22:43:34.902: I/SqliteDatabaseCpp(23902): sqlite returned: error code = 1, msg = table todos has no column named date, db=/data/data/com.example.todoistodo/databases/todos_db
08-06 22:43:34.922: E/SQLiteDatabase(23902): Error inserting date=Tomorrow  note= todo=Sleep out
08-06 22:43:34.922: E/SQLiteDatabase(23902): android.database.sqlite.SQLiteException: table todos has no column named date: , while compiling: INSERT INTO todos(date,note,todo) VALUES (?,?,?)
08-06 22:43:34.922: E/SQLiteDatabase(23902):    at com.example.todoistodo.TodoDAO.createTodo(TodoDAO.java:30)

谢谢!

【问题讨论】:

  • 你最近更新表结构了吗??
  • 如果您在第一次运行后添加了日期字段,则需要更新数据库版本以重新创建数据库或删除应用程序文件。
  • @Akhil Jain 不,我实际上没有。我应该如何更新它?
  • 你需要删除表,方法有很多种-> 手动写查询删除表,清除应用缓存,更新的原因是,一旦创建表,它即使您在表中添加新列,也不会重新创建,如果您这样做了,请删除表。下一个时间表将被重新创建/创建,并带有新列
  • 您可以在此处通过更改版本来强制更新数据库: super(context, "todos_db", null, 1); 2 而不是 1。

标签: java android sql


【解决方案1】:

这行有问题:

db.execSQL("CREATE TABLE todos (_id INTEGER PRIMARY KEY AUTOINCREMENT , todo TEXT NOT NULL , date TEXT NOT NULL , note TEXT NOT NULL);");

应该没有';'

db.execSQL("CREATE TABLE todos (_id INTEGER PRIMARY KEY AUTOINCREMENT , todo TEXT NOT NULL , date TEXT NOT NULL , note TEXT NOT NULL)");

【讨论】:

  • 我确定它不会改变任何东西,; 只是 SQL 中的一个分隔符,表示“嘿,这里开始另一个查询!”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多