java - Android SQLite 数据库处理程序实现错误

标签 java android sqlite android-sqlite

我一直在学习使用 SQLite 对数据库执行基本读/写的教程。

在 AddWord.java( Activity )中的加载数据操作中,程序卡住。我不确定调试器是哪一行失败了。该程序分为以下三个类:

DBHandler.Java:

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();
    }
}

入门.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;
    }
}

在 Activity 中:

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 PRIMARY KEY AUTOINCREMENT。末尾的分号 ; 是可选的。

DROP TABLE 中也需要空格:

db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS)
//                         here ^

getContactsCount() 中:

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();
}

...您在光标关闭后访问它。此外,由于您只对计数感兴趣,您可以要求数据库引擎为您计算行数:

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 helper onCreate() 中编辑数据库模式后,确保重新创建数据库。实现此目的的最简单方法是卸载应用程序,以便删除其数据文件(包括数据库文件)。

关于java - Android SQLite 数据库处理程序实现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732714/

相关文章:

java - 编写 SQL 查询以返回 2 个 sqlite 表中的所有字段(Android 应用程序)

java - Spring 安全单点登录

android - logcat 停止写入设备上的文件

java - 来自资源的 Android RandomAccessFile 使用

java - 在 Android Activity 之间传递字符串

database - 带有游标的sqlite3执行完整性错误

android - 优化对只读 sqlite 数据库的快速访问?

java - 如何从 jar 访问 package-info.java 运行时中的包级注释?

java - 如何增加Eclipse编辑器的宽度?

java - 我可以为 OpenGL 中的静态对象推送一次矩阵吗?