Java SQLiteException:表X没有名为Y的列
我正在尝试使用SQLDatabase作为对象的集合,这些对象包括点id、字符串名称、字符串日期和字符串注释。通过以下代码创建辅助对象后:Java SQLiteException:表X没有名为Y的列,java,android,sql,Java,Android,Sql,我正在尝试使用SQLDatabase作为对象的集合,这些对象包括点id、字符串名称、字符串日期和字符串注释。通过以下代码创建辅助对象后: package com.example.todoistodo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class TodoSQ
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.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)");
您最近是否更新了表结构?如果在第一次运行后添加了日期字段,则需要更新数据库版本以重新创建数据库或删除应用程序文件。@Akhil Jain不,我实际上没有。我应该如何更新它?您需要删除该表,有多种方法可以做到->手动编写查询以删除该表,清除应用程序缓存,更新的原因是,一旦创建了表,它就不会重新创建,即使您在表中添加了新列,如果您已经这样做,请删除该表。下一个时间表将被重新创建/创建,带有新的列您可以在这里通过更改版本强制更新数据库:supercontext,todos_db,null,1;2而不是1。我相信这不会改变任何事情;只是SQL中的一个分隔符,表示嘿,这里开始另一个查询!
db.execSQL("CREATE TABLE todos (_id INTEGER PRIMARY KEY AUTOINCREMENT , todo TEXT NOT NULL , date TEXT NOT NULL , note TEXT NOT NULL)");