1

SQLiteDatabase db = this.getWritableDatabase(); で例外が発生します。私のデータベースハンドラクラスを提供する

public class DatabaseHandler extends SQLiteOpenHelper {

    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;


    // Database Name
    private static final String DATABASE_NAME = "chat";

    // Contacts table name
    private static final String TABLE_CHAT = "chat_history";

    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_TT = "tt";
    private static final String KEY_TYPE = "type";
    private static final String KEY_MSG = "message";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CHAT_TABLE = "CREATE TABLE " + TABLE_CHAT + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TT + " TEXT," + KEY_TYPE + " TEXT,"
            + KEY_MSG + " TEXT" + ")";
        db.execSQL(CREATE_CHAT_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHAT);

        // Create tables again
        onCreate(db);
    }

    // Adding new contact

    public void addContact(String tt, String type, String msg) {
       SQLiteDatabase db = this.getWritableDatabase();
        System.out.println("tt "+tt);
        System.out.println("msg "+msg);
        System.out.println("type "+type);
        ContentValues values = new ContentValues();
        values.put(KEY_TT, tt); // Contact Name
        values.put(KEY_TYPE, type); // Contact Phone Number
        values.put(KEY_MSG, msg);

        // Inserting Row
        db.insert(TABLE_CHAT, null, values);
        db.close(); // Closing database connection
    }

    // Getting All Contacts
    public List<ChatHistory> getAllContacts(String T) {
        List<ChatHistory> contactList = new ArrayList<ChatHistory>();
        // Select All Query
        System.out.println("database T$$$$$$$$$$$"+T);

        String selectQuery = "SELECT  * FROM " + TABLE_CHAT + " WHERE "+ KEY_TT+"="+"'"+T+"'";

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                ChatHistory chatHistory = new ChatHistory();
            chatHistory.setID(Integer.parseInt(cursor.getString(0)));
                chatHistory.settt(cursor.getString(1));
            chatHistory.settype(cursor.getString(2));
            chatHistory.setmsg(cursor.getString(3));
                // Adding contact to list
                contactList.add(chatHistory);
            } while (cursor.moveToNext());
        }

        // return contact list
        return contactList;
    }
}

この行で例外が発生し続けます SQLiteDatabase db = this.getWritableDatabase();

そのヌルポインター例外..私は問題を解決できません。解決策を提案してください コンテキストのエラーです それを解決するにはどうすればよいですか?

4

6 に答える 6

0

DatabaseHandler クラス内でクエリ関連の作業を行わないでください。開く、閉じる、アップグレードする、関連する作業を作成するためだけに保管してください。明示的な例外がスローされた同期メソッド呼び出しを使用します。

手がかりとして、次のようにしてみてください。

    /**
     * open the db
     * @return this
     * @throws SQLException
     * return type: DatabaseHandler
     */
    public synchronized DatabaseHandler open() throws SQLException 
    {
        if(db == null || !db.isOpen())
            this.db = getWritableDatabase();
        return this;
    }

次に、rawquery に対して、Cursor オブジェクトを返すメソッドを定義します。

public synchronized Cursor rawQuery(String sql, String[] args) throws SQLException{
        if(db == null || !db.isOpen())
            this.open();
        return db.rawQuery(sql, args);
    }

次に、選択クエリ関連の作業を実行するクラスで次のようにします。

protected DatabaseHandler dbHandler;
dbHandler = DatabaseHandler.getInstance(activity.getApplicationContext());
String selectQuery = "SELECT  * FROM " + TABLE_CHAT + " WHERE "+ KEY_TT+"="+"'"+T+"'";
Cursor r = dbHandler.rawQuery(selectQuery, null);

関連するループ コードがその下に表示されます。

それが役立つことを願っています!

于 2013-06-19T08:06:28.973 に答える
-1

私は専門家ではなく、あなたが SQLiteopenhelper クラスをインターン以外の目的で使用していることを念頭に置いています。「データベースの作成とバージョン管理を管理するヘルパー クラス」に対してのみ拡張する必要があると思います。
したがって、databaseshandler クラスを使用して書き込み可能なデータベースを取得し、そこにデータベース操作のメソッドを配置する別のクラスを作成することをお勧めします。
同じように、提案されたクラスを作成できますが、現在のクラスを内部クラスとしてその中に入れます。(必ず CRUD メソッドを新しいクラスに移動してください。

于 2013-06-19T08:10:30.063 に答える