package com.renren.api.connect.android.pay.util; import java.util.ArrayList; import java.util.Date; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import com.renren.api.connect.android.pay.bean.PayOrder; public class PayStoreHelper extends SQLiteOpenHelper { /** * db version 12,版本号变高会重建数据库 */ private final static int DATABASE_VERSION = 12; private final static String DATABASE_NAME = "rrsdk_db"; private static final String TABLE_NAME = "rrsdk_payment"; private static final String CREATE_TABLE_SQL = "CREATE TABLE " + TABLE_NAME + " (" + " orderNumber varchar(21) primary key ," + " appId varchar(11) NOT NULL ," + " amount integer unsigned NOT NULL ," + " userId integer unsigned NOT NULL ," + " payment varchar(255)," + " bid varchar(32)," + " descr varchar(255)," + " payResultEncode varchar(32)," + " payStatusCode integer NOT NULL," + " dealTime bigint," + " orderTime bigint NOT NULL, " + " serverState tinyint NOT NULL," + " sandBox boolean NOT NULL," + " localEncode varchar(32) NOT NULL" + ");"; private static PayStoreHelper instance; public synchronized static PayStoreHelper getInstance(Context c) { if (instance == null) { instance = new PayStoreHelper(c); } return instance; } // 本地存储功能默认关闭 private boolean enbleLocalStore = false; private PayStoreHelper(Context c) { super(c, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " DROP TABLE IF EXISTS " + TABLE_NAME; db.execSQL(sql); onCreate(db); } public Cursor select(String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, columns, selection, selectionArgs, groupBy, having, orderBy); return cursor; } public long addOrUpdatePay(PayOrder order) { if (!enbleLocalStore) { return -1L; } SQLiteDatabase db = this.getWritableDatabase(); ContentValues cv = payOrder2cv(order); long row = -1L; try { row = db.insertOrThrow(TABLE_NAME, null, cv); } catch (SQLException e) { String where = "userId= ? AND orderNumber= ? "; String[] value = { String.valueOf(order.getUserId()), order.getOrderNumber() }; row = db.update(TABLE_NAME, cv, where, value); } return row; } /** * 根据payOrder对象生成数据库需要的数据 * * @param order * @return */ private ContentValues payOrder2cv(PayOrder order) { ContentValues cv = new ContentValues(); cv.put("orderNumber", order.getOrderNumber()); cv.put("appId", order.getAppId()); cv.put("amount", order.getAmount()); cv.put("userId", order.getUserId()); cv.put("payment", order.getPayment()); cv.put("bid", order.getBid()); cv.put("descr", order.getDescr()); cv.put("payResultEncode", order.getPayResultEncode()); cv.put("payStatusCode", order.getPayStatusCode()); cv.put("dealTime", order.getDealTime().getTime()); cv.put("orderTime", order.getOrderTime().getTime()); cv.put("serverState", order.getServerState()); cv.put("sandBox", order.isSandBox()); Log.d("dddd",String.valueOf(order.isSandBox())); cv.put("localEncode", order.getLocalEncode()); return cv; } /** * 根据appId和userId获得用户的所有订单对象集合 该集合从不会为null,但size可能为0 * * @param appId * @param userId * @return */ public List<PayOrder> getPayOrder(int appId, int userId) { if (!enbleLocalStore) { return null; } List<PayOrder> l = new ArrayList<PayOrder>(); String selectSql = "appId = ? and userId = ?"; String[] selectArgs = { String.valueOf(appId), String.valueOf(userId) }; Cursor cur = select(null, selectSql, selectArgs, null, null, "orderTime desc"); // 如果游标没有在开始之前,没有在结束之后 for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { PayOrder order = createPayOrder(cur); if (null != order) l.add(order); } cur.close(); return l; } /** * 将数据库记录转换为PayOrder对象 如果验证失败则返回null * * @param cur * @return */ private PayOrder createPayOrder(Cursor cur) { PayOrder order = null; if (cur != null && !cur.isClosed()) { order = new PayOrder(); order.setOrderNumber(cur.getString(0)); order.setAppId(cur.getString(1)); order.setAmount(cur.getInt(2)); order.setUserId(cur.getLong(3)); order.setPayment(cur.getString(4)); order.setBid(cur.getString(5)); order.setDescr(cur.getString(6)); order.setPayResultEncode(cur.getString(7)); order.setPayStatusCode(cur.getInt(8)); order.setDealTime(new Date(cur.getLong(9))); order.setOrderTime(new Date(cur.getLong(10))); order.setServerState(cur.getInt(11)); // sqlite用long 0 1来区分boolean order.setSandBox(cur.getLong(12) == 1 ? true : false); if (!order.getLocalEncode().equals(cur.getString(13))) { order = null; } } return order; } /** * 删除一个用户的所有记录 * * @param userId */ public void removeAllByUid(int userId) { if (!enbleLocalStore) { return; } SQLiteDatabase db = this.getWritableDatabase(); String where = " userId " + " =? "; String[] whereValue = { Integer.toString(userId) }; db.delete(TABLE_NAME, where, whereValue); } /** * 删除一条记录 * * @param userId * @param orderNumber */ public void removeByUidAndOrderNumber(int userId, String orderNumber) { if (!enbleLocalStore) { return; } SQLiteDatabase db = this.getWritableDatabase(); String where = " userId =? and orderNumber = ?"; String[] whereValue = { Integer.toString(userId), orderNumber }; db.delete(TABLE_NAME, where, whereValue); } public void enableLocalStore(boolean canDoStore) { this.enbleLocalStore = canDoStore; } public boolean isCanDoStore() { return enbleLocalStore; } }