0

Mac OS 10.7.5 で Android Studio を実行しています。私がクエリを作成しているアプリはデータベースであり、クエリが機能せず、まったく同じクエリで0の結果が生成されるという問題が発生し続けています。Firefox の SQLite マネージャーでクエリをテストしたところ、探している結果が得られました。

この問題も毎回発生するわけではありません。私はそれが機能している状態で仕事を離れて家に帰りますが、そうではありません。試してデバッグするために、有効なクエリをハードコーディングしましたが、まだ結果がありません。ただし、コードがハードコードされたクエリと他のクエリ方法で問題なく動作している場合。

このエラーのため、Preferences / Compiler / Use External Build で外部ビルドを使用するようにビルド設定を変更しようとしました:

10:56:27 PM Deprecated make implementation
        Old implementation of "Make" feature is enabled for this project.
        It has been deprecated and will be removed soon.
        Please enable newer 'external build' feature in Settings | Compiler.

イベントログで、それがしばらくの間機能した後、エラーが返されました。Android Studio の更新も試みましたが、これも 1 回修正されましたが、問題が再び発生しました。どんな助けや提案も大歓迎です。さらに情報が必要な場合はお知らせください。

public class DBAccess extends SQLiteOpenHelper {

private SQLiteDatabase database;

public static String TABLE_PATH = "";

public static final String COLUMN_ROWID = "rowid";
public static final String COLUMN_LASTNAME = "lastname";
public static final String COLUMN_FIRSTNAME = "firstname";

private static final String DATABASE_NAME = "employeedb.sqlite";
private static final String TABLE_EMPLOYEE = "employee";
private static final int DATABASE_VERSION = 1;

// Database creation SQL statement
private static final String DATABASE_CREATE_SQL = "create table "
        + TABLE_EMPLOYEE  + "("
        + COLUMN_ROWID    + " text, "
        + COLUMN_LASTNAME    + " text, "
        + COLUMN_FIRSTNAME    + " text"
        + ");";

public DBAccess(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    TABLE_PATH = context.getDatabasePath(Constants.databaseName).toString();

}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL(DATABASE_CREATE_SQL);
    }catch (SQLException e) {}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMPLOYEE);
    onCreate(db);
}

public void open() throws SQLException {
    database = getWritableDatabase();
}

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

public ArrayList<Person> searchSQLWithPrefix(String prefix, String[] params) {
    ArrayList<Person> results = new ArrayList<Person>();


    Cursor cursor = database.rawQuery("SELECT lastname, firstname FROM employee " +
            "WHERE UPPER(lastname) like UPPER('Smith') OR UPPER(firstname) like " +
            "UPPER('Smith') ORDER BY firstname, lastname LIMIT 1000", null);

    //Cursor cursor = database.rawQuery(prefix, params);

    if (cursor != null) {
        return setPeople(cursor);
    }
    cursor.close();
    return results;
}

public ArrayList<Person> setPeople(Cursor cursor) {
    ArrayList<Person> results = new ArrayList<Person>();
    Log.e("Test", "Cursor Count: " + cursor.getCount());

    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            Person p = new Person( cursor, cursor.getPosition() );
            results.add( p );
    }
    return results;
}
}
4

1 に答える 1

0

UI のどこかに結果を表示していると仮定しているので、Listview、ExpandedListView などを使用している場合、Android ビューでは、テーブルに列 _id が必要であり、ビューを保持できるようにクエリで取得する必要があります。 _id 列を介して、データベース カーソルからのデータ アダプタのデータと同期します。

私は一度も使用する必要がありませんでした

cursor.close();

そのため、カーソルをどのように管理しているかという問題が生じます。これは、アプリケーションのターゲットとしているバージョンに大きく依存します。Honeycomb 以降では「cursor loader」を調べ、それ以前は「startManagingCursor」が使用されていましたが、ユーザーのカーソル ローダーに推奨されると思います。これにより、カーソルを閉じる必要がなくなります。カーソルは非同期タイプのタスクであるため、結果を返す前にカーソルを閉じることができます。

カーソルローダーについては、Androidでローダーを使用する方法をお勧めします

github.com や code.google.com などでコードを検索することもできます。

何らかの理由で _id が必要な場合は、プロジェクションでこれを使用してクエリを偽造できます。

id as _id, 

お役に立てれば。

于 2013-07-30T21:27:21.667 に答える