mardi 24 novembre 2015

Android Content Provider - how to check columns for multiple tables

I have 2 tables in my sqlite database so now I'm trying to create content provider for the database. all of the examples i've seen so far only shows the CRUD code for 2 tables but not checkColumns. I tried doing this

private void checkColumns(String[] projection) {

    if (Constants.COLUMNS != null) {
        HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
        HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(Constants.COLUMNS));
        if (!availableColumns.containsAll(requestedColumns)) {
            throw new IllegalArgumentException("Unknown columns in projection");
        }
    }
    if (Constants.pCOLUMNS != null) {
        HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
        HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(Constants.pCOLUMNS));
        if (!availableColumns.containsAll(requestedColumns)) {
            throw new IllegalArgumentException("Unknown columns in projection");
        }
    }
}

then for the query, I tried this

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    checkColumns(Constants.COLUMNS);
    checkColumns(Constants.pCOLUMNS);
    queryBuilder.setTables(Constants.ITEM_TABLE);
    queryBuilder.setTables(Constants.PANTRY_TABLE);

    int type = URI_MATCHER.match(uri);
    switch (type) {
        case ITEMS:
            break;
        case ITEM:
            queryBuilder.appendWhere(Constants.COLUMN_iID + " = " + uri.getLastPathSegment());
            break;
        case sPANTRY:
            break;
        case PANTRY:
            queryBuilder.appendWhere(Constants.COLUMN_pID + " = " + uri.getLastPathSegment());
            break;
        default:
            throw new IllegalArgumentException("Unknown URI: " + uri);
    }
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}

from Constants.java

public static final String[] COLUMNS = {
        Constants.COLUMN_iID,
        Constants.COLUMN_ITEM,
        Constants.COLUMN_iQUANTITY,
        Constants.COLUMN_iUNIT,
        Constants.COLUMN_PRICE,
        Constants.COLUMN_STORE

};

public static final String[] pCOLUMNS = {
        Constants.COLUMN_pID,
        Constants.COLUMN_PANTRY,
        Constants.COLUMN_pQUANTITY,
        Constants.COLUMN_pUNIT,
        Constants.COLUMN_EXPIRY_DATE
};
}

but I get this error

Caused by: java.lang.IllegalArgumentException: Unknown columns in projection

I tried using switch case instead in checkColumns like this

private void checkColumns(String[] projection) {
    switch(projection) {
        case Constants.COLUMNS:
            HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
            HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(Constants.COLUMNS));
            if (!availableColumns.containsAll(requestedColumns)) {
                throw new IllegalArgumentException("Unknown columns in projection");
            }
            break;
        case Constants.pCOLUMNS:
            HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
            HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(Constants.pCOLUMNS));
            if (!availableColumns.containsAll(requestedColumns)) {
                throw new IllegalArgumentException("Unknown columns in projection");
            }
           break;
    }
}

but I get 'constant expression required' on both Constants.

Aucun commentaire:

Enregistrer un commentaire