Reputation: 43
First of all, I've checked the other similar thread on here but nothing seems to work for me. But then, this is my first android app so maybe there's something that I overlooked or not understand. Anyway, here are my codes.
MyContentProvider.java
@SuppressWarnings("ConstantConditions")
public class MyContentProvider extends ContentProvider {
private DbHelper dbHelper;
private static final String BASE_PATH_ITEM = "items";
private static final String AUTHORITY = "data.MyContentProvider";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_ITEM);
private static final int ITEM = 100;
private static final int ITEMS = 101;
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static {
URI_MATCHER.addURI(AUTHORITY, BASE_PATH_ITEM, ITEM);
URI_MATCHER.addURI(AUTHORITY, BASE_PATH_ITEM + "/#", ITEMS);
}
private void checkColumns(String[] projection) {
if (projection != 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");
}
}
}
@Override
public boolean onCreate() {
dbHelper = new DbHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
checkColumns(projection);
queryBuilder.setTables(Constants.ITEM_TABLE);
int type = URI_MATCHER.match(uri);
switch (type){
case ITEM:
//there is not to do if the query is for the table
break;
case ITEMS:
queryBuilder.appendWhere(Constants.COLUMN_ID + " = " + 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;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int type = URI_MATCHER.match(uri);
SQLiteDatabase db = dbHelper.getWritableDatabase();
Long id;
switch (type){
case ITEMS:
id = db.insert(Constants.ITEM_TABLE, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(BASE_PATH_ITEM + "/" + id);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int type = URI_MATCHER.match(uri);
SQLiteDatabase db = dbHelper.getWritableDatabase();
int rowsDeleted;
switch (type) {
case ITEM:
rowsDeleted = db.delete(Constants.ITEM_TABLE, selection, selectionArgs);
break;
case ITEMS:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsDeleted = db.delete(Constants.ITEM_TABLE, Constants.COLUMN_ID + "=" + id, null);
} else {
rowsDeleted = db.delete(Constants.ITEM_TABLE, Constants.COLUMN_ID + "=" + id + " and " + selection, selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int type = URI_MATCHER.match(uri);
SQLiteDatabase db = dbHelper.getWritableDatabase();
int rowsUpdated;
switch (type) {
case ITEM:
rowsUpdated = db.update(Constants.ITEM_TABLE, values, selection, selectionArgs);
break;
case ITEMS:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsUpdated = db.update(Constants.ITEM_TABLE, values, Constants.COLUMN_ID + "=" + id, null);
} else {
rowsUpdated = db.update(Constants.ITEM_TABLE, values, Constants.COLUMN_ID + "=" + id + " and " + selection, selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
}
DBHelper.java
public class DbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyApp.db";
private static final int DATABASE_VERSION = 1;
//create item table statement
private static final String CREATE_TABLE_ITEM = "create item table "
+ Constants.ITEM_TABLE
+ "("
+ Constants.COLUMN_ID + " integer primary key autoincrement, "
+ Constants.COLUMN_ITEM + " text not null, "
+ Constants.COLUMN_QUANTITY + " integer not null, "
+ Constants.COLUMN_UNIT + " integer not null, "
+ Constants.COLUMN_PRICE + " integer not null, "
+ Constants.COLUMN_STORE + " text not null, "
+ ")";
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE_ITEM = "create item table "
+ Constants.ITEM_TABLE
+ "("
+ Constants.COLUMN_ID + " integer primary key autoincrement, "
+ Constants.COLUMN_ITEM + " text not null, "
+ Constants.COLUMN_QUANTITY + " integer not null, "
+ Constants.COLUMN_UNIT + " integer not null, "
+ Constants.COLUMN_PRICE + " integer not null, "
+ Constants.COLUMN_STORE + " text not null, "
+ ")";
//create the required table
db.execSQL(CREATE_TABLE_ITEM);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + Constants.ITEM_TABLE);
//create new table
onCreate(db);
}
}
Constants.java
public class Constants {
public static final String ITEM_TABLE = "items";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_ITEM = "item";
public static final String COLUMN_QUANTITY = "quantity";
public static final String COLUMN_UNIT = "unit";
public static final String COLUMN_PRICE = "price";
public static final String COLUMN_STORE = "store";
public static final String[] COLUMNS = {
Constants.COLUMN_ID,
Constants.COLUMN_ITEM,
Constants.COLUMN_QUANTITY,
Constants.COLUMN_UNIT,
Constants.COLUMN_PRICE,
Constants.COLUMN_STORE
};
}
Logcat
java.lang.RuntimeException: Unable to start activity ComponentInfo{*package name removed*.activities.MainActivity}: android.database.sqlite.SQLiteException: no such table: items (code 1): , while compiling: SELECT _id, item, quantity, unit, price, store FROM items
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: no such table: items (code 1): , while compiling: SELECT _id, item, quantity, unit, price, store FROM items
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294)
at *package name removed*.data.GPContentProvider.query(GPContentProvider.java:75)
at android.content.ContentProvider.query(ContentProvider.java:857)
at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
at android.content.ContentResolver.query(ContentResolver.java:461)
at android.content.ContentResolver.query(ContentResolver.java:404)
at zarry.gptest.data.ItemManager.getAllItems(ItemManager.java:63)
at *package name removed*.fragments.ItemListFragment.setupList(ItemListFragment.java:96)
at *package name removed*.fragments.ItemListFragment.onCreateView(ItemListFragment.java:50)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1965)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1078)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1259)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1624)
at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
at android.app.Activity.performStart(Activity.java:5241)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Thanks in advance
Upvotes: 1
Views: 650
Reputation: 171
You missed a whitespace:
create table items here(_id integer
and extra comma:
store text not null,<-this )
and add semicolon at the end.
String CREATE_TABLE_ITEM = "create table "
+ Constants.ITEM_TABLE
+ " ("
+ Constants.COLUMN_ID + " integer primary key autoincrement, "
+ Constants.COLUMN_ITEM + " text not null, "
+ Constants.COLUMN_QUANTITY + " integer not null, "
+ Constants.COLUMN_UNIT + " integer not null, "
+ Constants.COLUMN_PRICE + " integer not null, "
+ Constants.COLUMN_STORE + " text not null);";
Upvotes: 0
Reputation: 157437
your create table query is wrong. You have
String CREATE_TABLE_ITEM = "create item table "
item between create
and table
It should be
String CREATE_TABLE_ITEM = "create table " + Constants.ITEM_TABLE ..
Upvotes: 5