안드로이드 개발 질문/답변
(글 수 45,052)
content provider에 대해 공부를 하고있습니다.
교재는 "안드로이드 앱개발 완벽가이드"로 입니다.
장바구니를 구현하는 곳에서 막혔는데요.
cartSQLiteOpenHelper.java에서 db, 테이블, 필드를 생성하고
cartCP.java에서 콘텐트 프로바이더를 이용하여 주소에 해당하는 테이블에 데이터를 생성,수정,삭제를 하는 소스입니다.
mallCart.java DB에 저장된 정보를 보여줄 엑티비티입니다.
질문1.
장바구니인 mallcart를 두개로 나누어 사용하려 합니다. AmallCart와 BmallCart로 말하겠습니다.
AmallCart는 cart.db의 Acart테이블에 저장하고 BmallCart는 cart.db의 Bcart테이블에 저장하고 싶습니다.
cartSQLiteOpenHelper.java에서 테이블을 하나 더 생성하는 방법은 알지만 그 테이블에 데이터를 저장하는 방법을 모르겠습니다.
블로그나 웹사이트 예제파일을 봐도 테이블을 하나만 이용해서 어떻게 적용하는지 감이 안잡히네요....
콘텐트 프로바이더에서 다수의 테이블을 사용할수 있나요?
public class cartCP extends ContentProvider {
public static final String uriString = "content://com.owl.app.cartProvider/cart";
public static final Uri CONTENT_URI = Uri.parse(uriString);
SQLiteDatabase db;
cartSQLiteOpenHelper helper;
public String TABLE_NAME = cartSQLiteOpenHelper.TABLE_NAME;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String whereClause = selection;
String[] whereArgs = selectionArgs;
int result = db.delete(TABLE_NAME, whereClause, whereArgs);
return result;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
db = helper.getWritableDatabase();
long rowId = db.insert(cartSQLiteOpenHelper.TABLE_NAME, "", values);
if (rowId > 0) {
Uri rowUri = ContentUris.appendId(CONTENT_URI.buildUpon(), rowId).build();
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public boolean onCreate() {
helper = new cartSQLiteOpenHelper(getContext());
db = helper.getWritableDatabase();
return true;
}
@Override
public Cursor query(Uri uri_A, String[] projection, String selection
, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
SQLiteDatabase db = helper.getReadableDatabase();
qb.setTables(TABLE_NAME);
Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri_A);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String selection
, String[] selectionArgs) {
String whereClause = selection;
String[] whereArgs = selectionArgs;
int result = db.update(TABLE_NAME, values, whereClause, whereArgs);
return result;
}
}cartCP.java public class cartSQLiteOpenHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_FILE = "cart.db";
public static final String TABLE_NAME = "cart";
public cartSQLiteOpenHelper(Context context) {
super(context, DATABASE_FILE, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TABLE_NAME + " ("
+"num integer primary key autoincrement"
+", rowid integer"
+", prodname varchar"
+", sortname varchar"
+", price integer"
+", ea integer"
+", maxea integer"
+", img varchar"
+");";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = "drop table if exists " + TABLE_NAME + ";";
db.execSQL(sql);
onCreate(db);
}
}cartSQLiteOpenHelper.java
public class mallCart_shop extends Activity {
public HashMap<String, String> hm = new HashMap<String, String> (); //장바구니에 추가할 상품정보를 웹서버에서 받아 기록할 객채
HashMap<String, String> hmCart = new HashMap<String, String> (); // 기존에 담아둔 장바구니 데이터를 받아올 객체
ContentResolver cr; //장바구니 데이터와 통신할 콘텐트 리졸버를 선언
public static final String uriString_A = "content://com.owl.app.cartProvider/cart"; // 장바구나 콘텐트 프로바이더의 주소
public static final Uri CONTENT_URI = Uri.parse(uriString_A); // 장바구나 콘텐트 프로바이더의 주소를 uri방식으로 해독
.
.
.
.
.
.
.//콘텐트 리졸버를 통해 장바구니에 추가/수정할 상품 정보를 가져옵니다.
String fields = "num,rowid,prodname,sortname,price,ea,maxea,img"; //장바구니 테이블에서 가져올 필드를 정의
String[] projection = cmsutil.explode_trim(",", fields); // 장바구니 필드를 배열형식으로 변환
String selection = "rowid='"+rowid+"'"; 상품번호를 검색조건으로 정의
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = cr.query(CONTENT_URI, projection, selection, selectionArgs, sortOrder); //콘텐츠 리졸버에서 지원하는 query를 사용하여 장바구니에 있는 기존상품 정보를 가져옴
HashMap<String, String> hmCartOld = new HashMap<String, String>(); // Cursor형의 상품 정보를 HashMap형태로 변환
hmCartOld = cmsutil.cursor2HashMap(cursor);
cursor.close(); // 커서객체는 사용이 완료되면 반드시 닫아줘야합니다.
.
.
.
.
.
주문 수량이 양수이면, 장바구니에 있는 상품에 대한 주문 수량을 수정해 줍니다.
if (ea>0) {
ContentValues contVal = new ContentValues();
contVal.put("ea", ea);
cr.update(CONTENT_URI_A, contVal, selection, selectionArgs);
} else {
cr.delete(CONTENT_URI_A, selection, selectionArgs);
String tmp = "주문량이 없어 다음 제품을 삭제합니다.\n"+hmCartOld.get("prodname[0]");
Toast.makeText(getParent().getBaseContext(), tmp, Toast.LENGTH_LONG).show();
}
} else { //등록된 상품이 없을시 새로 등록합니다.
if (ea>0) { 주문수량이 있을 때만 장바구니 테이블에 등록합니다.
ContentValues contVal = new ContentValues(); // Content Values를 이용하여 등록할 데이터의 필드값을 정의합니다.
contVal.put("rowid", cmsutil.str2int(rowid,-1));
contVal.put("prodname", hm.get("prodName[0]"));
contVal.put("sortname", hm.get("sortName[0]"));
contVal.put("price", cmsutil.str2int(hm.get("price[0]"),0));
contVal.put("ea", ea);
contVal.put("maxea", cmsutil.str2int(hm.get("maxEa[0]"),0));
contVal.put("img", hm.get("img[0]"));
cr.insert(CONTENT_URI, contVal); // 콘텐트 리졸버의 insert매소드를 실행합니다.
.
.
.
.
.
public void initRow() {// 장바구니 테이블에서 상품 목록을 가져옵니다.
String[] projection = null;
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;
Cursor cursor = cr.query(CONTENT_URI, projection, selection, selectionArgs, sortOrder); // query를 이용하여 선택질의를 한다.
hmCart = cmsutil.cursor2HashMap(cursor); //선택질의 결과값인 Cursor를 HashMap으로 변환
cursor.close();
.
.
.
.
.
mallCart.java




Uri 를 이용하면 됩니다.
테이블은 create 할때 table 이름만 다르게 해서 만들면 되고
delete, update, query 와 같은 놈들은 인자에 Uri 라는 놈이 있습니다.
기본적으로 하나만 있으나까 Uri 를 설정하지 않아도 상관 없으나 여러개 하고 싶으면
if(Uri.equals("aaaaaa")
{
// db 어쩌고 저쩌고
}
else if(Uri.equals("bbbbb")
{
// db ...
}
이런 식으로 구현 하면 됩니다.
호출 시는
getContentResolver().query("bbbbb", null, null, null, null);
이런식으로 Uri 를 설정하면 원하는 table에 접근할수 있습니다.
구글하면 다 있는 내용입니다.