Java Android SQLite数据库处理程序实现错误
我一直在学习使用SQLite对数据库执行基本读/写操作的教程 在AddWord.java(活动)中的loaddata操作上,程序冻结。我无法从调试器中确定哪一行失败。该计划分为以下三类: DBHandler.Java:Java Android SQLite数据库处理程序实现错误,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我一直在学习使用SQLite对数据库执行基本读/写操作的教程 在AddWord.java(活动)中的loaddata操作上,程序冻结。我无法从调试器中确定哪一行失败。该计划分为以下三类: DBHandler.Java: package com.AH.memorisethai; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.
package com.AH.memorisethai;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
public class DBHandler extends SQLiteOpenHelper {
private static final String KEY_ID = "id";
private static final String KEY_ENGLISH = "english";
private static final String KEY_THAI = "thai";
private static final String KEY_WORDTYPE = "wordtype";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "wordsmanager";
private static final String TABLE_WORDS = "words";
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_WORDS
+ "(" + KEY_ID + " AUTOINCREMENT," + KEY_ENGLISH + " TEXT NOT NULL," + KEY_THAI + " TEXT NOT NULL" + ");";
public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS" + TABLE_WORDS);
onCreate(db);
}
public void addEntry(Entry entry) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ENGLISH, entry.getEnglishword()); // Contact Name
values.put(KEY_THAI, entry.getThaiword()); // Contact Phone Number
// Inserting Row
db.insert(TABLE_WORDS, null, values);
db.close(); // Closing database connection
}
// Getting contacts Count
public int getContactsCount() {
String countQuery = "SELECT * FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
}
Entry.Java:
package com.AH.memorisethai;
public class Entry {
private long id;
private String englishword;
private String thaiword;
public Entry(){
}
public Entry(int id, String englishword, String thaiword){
this.id = id;
this.englishword = englishword;
this.thaiword = thaiword;
}
// constructor
public Entry(String englishword, String thaiword){
this.englishword = englishword;
this.thaiword = thaiword;
}
public long getId(){
return id;
}
public String getEnglishword(){
return englishword;
}
public String getThaiword(){
return thaiword;
}
public void setId(long id){
this.id=id;
}
public void setEnglishword(String englishword){
this.englishword=englishword;
}
public void setThaiword(String thaiword){
this.thaiword=thaiword;
}
}
在活动中:
public int getContactsCount() {
String countQuery = "SELECT COUNT(*) FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = -1;
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
}
cursor.close();
return count;
}
由于目前没有数据,ed应该返回0的值-我认为这是确保DBHandler代码正常工作的最简单测试。这里有多个问题
首先,这里有SQL语法问题:
private static final String TABLE_CREATE = "CREATE TABLE" + TABLE_WORDS
+ "(" + KEY_ID + "AUTOINCREMENT," + KEY_ENGLISH + "TEXT NOT NULL," + KEY_THAI + "TEXT NOT NULL" + ");";
您需要在关键字和标识符之间添加空格,如下所示:
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_WORDS
+ "(" + KEY_ID + " AUTOINCREMENT," + KEY_ENGLISH + " TEXT NOT NULL," + KEY_THAI + " TEXT NOT NULL" + ");";
AUTOINCREMENT
要求它是INTEGER主键AUTOINCREMENT
。分号末尾的代码>是可选的
删除表中也需要空格
:
db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS)
// here ^
在getContactsCount()
中:
。。。光标关闭后,您将访问它。此外,由于您仅在计数中进行了测试,因此可以要求数据库引擎为您计数行:
public int getContactsCount() {
String countQuery = "SELECT COUNT(*) FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = -1;
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
}
cursor.close();
return count;
}
在db helperonCreate()
中编辑数据库架构后,请确保重新创建数据库。实现这一点最简单的方法是卸载应用程序,以便删除包括数据库文件在内的数据文件。这里有多个问题
首先,这里有SQL语法问题:
private static final String TABLE_CREATE = "CREATE TABLE" + TABLE_WORDS
+ "(" + KEY_ID + "AUTOINCREMENT," + KEY_ENGLISH + "TEXT NOT NULL," + KEY_THAI + "TEXT NOT NULL" + ");";
您需要在关键字和标识符之间添加空格,如下所示:
private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_WORDS
+ "(" + KEY_ID + " AUTOINCREMENT," + KEY_ENGLISH + " TEXT NOT NULL," + KEY_THAI + " TEXT NOT NULL" + ");";
AUTOINCREMENT
要求它是INTEGER主键AUTOINCREMENT
。分号末尾的代码>是可选的
删除表中也需要空格
:
db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS)
// here ^
在getContactsCount()
中:
。。。光标关闭后,您将访问它。此外,由于您仅在计数中进行了测试,因此可以要求数据库引擎为您计数行:
public int getContactsCount() {
String countQuery = "SELECT COUNT(*) FROM " + TABLE_WORDS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = -1;
if (cursor.moveToFirst()) {
count = cursor.getInt(0);
}
cursor.close();
return count;
}
在db helperonCreate()
中编辑数据库架构后,请确保重新创建数据库。实现这一点的最简单方法是卸载应用程序,以便删除包括数据库文件在内的数据文件。加载数据中的哪一行?在方法中放置一个断点,看看它在退出之前下降了多远。另外,您的KEY\u ID
应该是autoincrement
,您在TABLE\u CREATE
字符串的末尾漏掉了一个分号。感谢@BigT-我已按照建议将KEY\u ID
更改为autoincrement
,并在TABLE\u CREATE
字符串的末尾添加了分号(有问题的代码已修改)。它失败的行是:int a=db.getContactScont()代码>加载数据中的哪一行?在方法中放置一个断点,看看它在退出之前下降了多远。另外,您的KEY\u ID
应该是autoincrement
,您在TABLE\u CREATE
字符串的末尾漏掉了一个分号。感谢@BigT-我已按照建议将KEY\u ID
更改为autoincrement
,并在TABLE\u CREATE
字符串的末尾添加了分号(有问题的代码已修改)。它失败的行是:int a=db.getContactScont()代码>非常感谢-我已经添加了这些内容,现在可以完美地工作了。顺便说一句,由于我对Android(和SQLite)中的数据库不熟悉,这是在Android中以代码行的形式建立SQLite数据库的一种相当有效的方法吗?非常感谢-我已经添加了一些内容,现在它可以完美地工作了。顺便说一句,由于我对Android(和SQLite)中的数据库不熟悉,这是在Android中按照代码行设置SQLite数据库的一种相当有效的方法吗?