在这个BaseDao
里面,几乎分担了数据表大部分的脏活累活,根据model
结构自动生成对应SQL
并创建对应表,以及基础的增删改查操作。
2.3 建对应model 的Dao层
1.UserDao
public class UserDao<User> extends BaseDao<User> { @Override public Long insert(User entity) { return super.insert(entity); } @Override public List<User> query(User where) { return super.query(where); } @Override public int delete(User where) { return super.delete(where); } @Override public int update(User entity, User where) { return super.update(entity, where); } @Override public List<User> query(User where, String groupBy, String orderBy, String having, Integer startIndex, Integer limit) { return super.query(where, groupBy, orderBy, having, startIndex, limit); } }
2.PhotoDao
public class PhotoDao<Photo> extends BaseDao<Photo> { @Override public Long insert(Photo entity) { return super.insert(entity); } @Override public int update(Photo entity, Photo where) { return super.update(entity, where); } @Override public List<Photo> query(Photo where) { return super.query(where); } @Override public int delete(Photo where) { return super.delete(where); } }
代码分析:
虽然 BaseDao
已经完成了几乎所有的操作,但是一旦遇到多表查询的时候,光是一个BaseDao
远远不够。所以这里还是选择创建不同model
的Dao
层,并继承与BaseDao
。也就是说,有多少表,最好就创建对应多少个Dao层。
3、创建数据库工厂
public class BaseDaoFactory { private final String TAG = "hqk"; private SQLiteDatabase sqLiteDatabase; private String sqliteDatabasePath; private static BaseDaoFactory instance = new BaseDaoFactory(); //饿汉单例模式 public static BaseDaoFactory getInstance() { return instance; } public BaseDaoFactory() { //读者可随意更改路径以及对应数据库名,这里演示暂时放在根目录 sqliteDatabasePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/hqk.db"; sqLiteDatabase = SQLiteDatabase.openOrCreateDatabase(sqliteDatabasePath, null); Log.i(TAG, "sqliteDatabasePath : " + sqliteDatabasePath); Log.i(TAG, "sqLiteDatabase : " + sqLiteDatabase.getPath()); } /** * @param clazz * @param entityClass * @param <R> 我们在这可以把它看成某一个对象,它继承与 BaseDao<T> ,而里面的T 就是下面的那个空对象 * @param <T> 我们在这可以吧它看成某一个空对象 T * @return */ public synchronized <R extends BaseDao<T>, T> R createBaseDao(Class<R> clazz, Class<T> entityClass) { BaseDao baseDao = null; try { baseDao = clazz.newInstance(); baseDao.init(entityClass, sqLiteDatabase); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return (R) baseDao; } }
代码分析:
这里也没啥好分析的,就一个数据库创建,以及对应model
的初始化。唯一值得注意的就是初始化的时候用了俩个泛型,具体什么意思,可按照代码注释理解。
4、创建对应model
1.User
@DbTable("tb_user") public class User { @DbPrimaryKey(value = "tb_id", isAuto = true) @DbFiled("tb_id") public Integer id; @DbFiled("tb_name") public String name;// @DbFiled("tb_age") public Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public User() { } }
2.Photo
@DbTable("tb_photo") public class Photo { @DbFiled("time") private String time; @DbFiled("id") private Long id; @DbFiled("path") private String path; public Photo( ) { } public Photo(String time, Long id, String path) { this.time = time; this.id = id; this.path = path; } public void setTime(String time) { this.time = time; } public void setId(Long id) { this.id = id; } public void setPath(String path) { this.path = path; } }
代码分析:
这俩类就是对应表结构model
类,用到了对应注解,相信通过注解能够清楚知道对应表结构是怎样的。
5、最终使用
ainActivity
public class MainActivity extends AppCompatActivity { UserDao<User> userDao; PhotoDao<Photo> photoDao; private ArrayList<User> listUser = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(this); } public void save(View view) { User user = new User("hqk", 18); long size = userDao.insert(user); Photo photo = new Photo("time", System.currentTimeMillis(), "path"); long photoSize = photoDao.insert(photo); Toast.makeText(this, "save line : " + size, Toast.LENGTH_LONG).show(); } public void update(View view) { User where = new User(); where.setAge(18); int size = userDao.update(new User("TOM", 99), where); Toast.makeText(this, "update Size : " + size, Toast.LENGTH_LONG).show(); } public void delete(View view) { User where = new User(); where.setAge(18); int size = userDao.delete(where); Toast.makeText(this, "delete Size : " + size, Toast.LENGTH_LONG).show(); } public void queryList(View view) { listUser.clear(); listUser.addAll(userDao.query(new User())); Toast.makeText(this, "查询条数为:" + listUser.size(), Toast.LENGTH_LONG).show(); } public void requestPermission( Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1); return; } createTable(); } private void createTable() { userDao = BaseDaoFactory.getInstance().createBaseDao(UserDao.class, User.class); photoDao = BaseDaoFactory.getInstance().createBaseDao(PhotoDao.class, Photo.class); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); createTable(); } }
到此这篇关于Android
架构之数据库框架搭建的文章就介绍到这了,更多相关Android
架构数据库框架搭建内容请搜索
标签:SQLite
相关阅读 >>
android开发实现的导出数据库到excel表格功能【附源码下载】
Sqlitemanager怎么激活Sqlite数据库管理软件激活图文教程
分享php代码将360浏览器导出的favdb的Sqlite数据库文件转换为html
更多相关阅读请进入《Sqlite》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。