使用OrmLite持久化SQLite(续)

上回说到我们已经建立了实体类Account和Order,下面我们来对它进行一个OrmLite的注解。

@DatabaseTable(tableName = "accounts") //不写的话表名默认为类名(小写)account public class Account implements Serializable { @DatabaseField(generatedId=true) //设置为自增长的主键 private int aId; @DatabaseField //使用默认,列名与字段名相同 private String aName; //一定要有一个无参的构造函数 public Account() { super(); } ..... }


@DatabaseTable(tableName = "orders") public class Order implements Serializable { @DatabaseField(generatedId=true) private int oid; @DatabaseField private String oName; @DatabaseField(foreign=true) //简单地写一个外键=true就行了 方便大家理解 private Account account; ...... }

接着我们创建一个DataHelper类继承自OrmLiteSqliteOpenHelper(相当于数据库访问层):

public class DataHelper extends OrmLiteSqliteOpenHelper { private static final String DATABASE_NAME = "test.db"; // 数据库名 private static final int DATABASE_VERSION = 1; // 数据库版本号,以后如果对实体类进行了修改,想要更新一下数据库的话,改一下版本号就行了 @SuppressWarnings("rawtypes") Map<String, Dao> daoMaps = null; // 所有DAO的集合,这不是必须的,你可以采用你的方式 @SuppressWarnings("rawtypes") private void initDaoMaps() { daoMaps = new HashMap<String, Dao>(); daoMaps.put("accountDao", null); daoMaps.put("orderDao", null); } public DataHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); // 用过SQLite的都知道,我就不解释了 initDaoMaps(); // 自定义方法 ,初始化dao的Map. } @Override public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { // 数据库创建时自动执行,以后不会再自动执行 try { TableUtils.createTable(connectionSource, Account.class); // 创建Account表 TableUtils.createTable(connectionSource, Order.class); // 创建Order表 Log.i(DataHelper.class.getName(), "创建数据库成功!"); } catch (Exception e) { Log.i(DataHelper.class.getName(), "创建数据库失败!", e); e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int arg2, int arg3) { // 数据库检测到版本号不同时自动执行,在这里我们应该: try { // 1:删除原有的旧表 TableUtils.dropTable(connectionSource, Account.class, true); TableUtils.dropTable(connectionSource, Order.class, true); // 2:创建现在的新表 onCreate(db, connectionSource); Log.e(DataHelper.class.getName(), "更新数据库成功"); } catch (SQLException e) { Log.e(DataHelper.class.getName(), "更新数据库失败", e); e.printStackTrace(); } } @Override public void close() { super.close(); daoMaps.clear(); } //给它一个实体类,返回该实体类专用的Dao,功能很强大 @SuppressWarnings("unchecked") public Dao<Account, Integer> getAccountDao() { Dao<Account, Integer> accountDao = daoMaps.get("accountDao"); if (accountDao == null) { try { accountDao = getDao(Account.class); } catch (SQLException e) { e.printStackTrace(); } } return accountDao; } @SuppressWarnings("unchecked") public Dao<Order, Integer> getOrderDao() { Dao<Order, Integer> orderDao = daoMaps.get("orderDao"); if (orderDao == null) { try { orderDao = getDao(Order.class); } catch (SQLException e) { e.printStackTrace(); } } return orderDao; } }
然后写业务逻辑层Service :

public class AccountService implements IAccountService{ private Dao<Account, Integer> accountDao = null; public AccountService(Dao<Account, Integer> dao) { accountDao = dao; } public String reg(Account account) { boolean result = false; try { accountDao.create(account); result = true; } catch (SQLException e) { e.printStackTrace(); } String msg= result ? "注册客户成功!" : "注册失败"; return msg; } public Account load(String name) { Account account = null; Map<String, Object> accountMap = new HashMap<String, Object>(); accountMap.put("aName", name); try { List<Account> list = accountDao.queryForFieldValues(accountMap); account = list != null && list.size() == 1 ? list.get(0) : null; } catch (SQLException e) { e.printStackTrace(); } return account; } }
OrderService与上类似 ,我就不贴出来占位置了,接着到了我们的UI层。

修改我们的Activity类,继承自OrmLiteBaseActivity<DataHelper>,这是一个抽象类OrmLiteBaseActivity<H extends OrmLiteSqliteOpenHelper>,它也是继承自Activity的,所以我们的Activity类相当于是间接继承自Activity:

public class OrmLiteTestActivity extends OrmLiteBaseActivity<DataHelper> implements OnClickListener { private Button btnRegAccount, btnAddOrder, btnShow; private TextView tvMsg = null; private IAccountService accountService = null; private IOrderService orderService = null; private int accountID = 0; private int orderID = 0; private String msg = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { // 初始化service accountService = new AccountService(getHelper().getAccountDao()); orderService = new OrderService(getHelper().getOrderDao()); btnRegAccount = (Button) this.findViewById(R.id.btnRegAccount); btnAddOrder = (Button) this.findViewById(R.id.btnAddOrder); btnShow = (Button) this.findViewById(R.id.btnShow); tvMsg = (TextView) this.findViewById(R.id.tvMsg); btnRegAccount.setOnClickListener(this); btnAddOrder.setOnClickListener(this); btnShow.setOnClickListener(this); } @Override public void onClick(View v) { msg = ""; switch (v.getId()) { case R.id.btnRegAccount: accountID++; Account account = new Account("客户" + accountID); msg = accountService.reg(account) ? "注册客户成功!" : "注册客户失败!"; break; case R.id.btnAddOrder: orderID++; account = accountService.load("客户1"); Order order = new Order("定单" + orderID, account); msg = orderService.addOrder(order) ? "添加定单成功!" : "添加定单失败!"; break; case R.id.btnShow: List<Order> list = orderService.findOrderByAccountID(1); for (Order o : list) { msg += o.getOid() + ":" + o.getoName() + "\n"; } break; default: break; } tvMsg.setText(msg); } }运行后效果如下: 最后是查找客户1的所有定单

这样我们就实现了使用OrmLite实现持久化数据了,完整代码可以在我的资源列表中下载:

http://download.csdn.net/detail/a_mean/3805488

欢迎交流、补充、找错,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值