自己设计过App的数据库框架-还是只是停留在使用ormlite-greenDao这类框架,一篇文章帮你解答(1)

现在数据库有很多三方框架,比如GreenDao,Afinal、xUtils、ThinkAndroid、volley等等。

但是这些三方导入后,文件数太大了。而且很多都集成了网络加载框架,图片加载框架。

这样就有了一定的耦合性。比如我只喜欢xUtils的数据库框架,不喜欢它的网络加载,想用Volley的网络加载框架。

咋办呢?两个都导入?是的,可以这样,但是项目的文件数就太大了。编译时压力大。而且一些公司想让程序猿写自己的框架,不使用别人发布的框架,这样代码是可以高扩展的。出现什么问题也是可以及时修改。如果导入的三方库在项目成熟阶段出现问题。那是不是要推翻这个库,重新去导入一个,重新在写一遍逻辑,而且又有谁能保证,再次导入的库不会出错呢?

我把大致的封装思路,以图片的形式展示出来。

###对应的UML图

使用起来也非常方便,这里的映射逻辑和GreenDao的底层源码使用的是一个原理。采用表和类属性映射,并对其进行了缓存。只有在切换表的链接时,会重新建立链接。

优点:

1、支持sql语句自拼接。数据库直接执行sql语句。

2、支持传入类对象进行增删改查,比如User,在insert的时候,插入User的实例,属性都封装在user中。通过反射获取它的属性值,存入数据库。

3、高扩展,每个新建的存储类型。直接继承DefaultBaseDao即可。可以在这里做一些该类独有的操作。

4、支持多数据库切换,多数据库操作。同时支持数据库分库管理,多数据库多版本多用户同时升级,采取XML脚本升级。这里的脚本语句没有封装。

5、支持boolean、byte、short、int、long、float、double数据类型的存储和读取。

使用注意事项:

1、创建存储数据类时,需要使用注解去标注类名(表名@DbTable)、类属性(表字段@DbField)。若是有主键(@DbPrimaryField)也需要标注。

2、需要创建一个相应的Dao层类和数据库的链接。

使用时导入gandle: compile ‘com.singleshu8:LemonDao:1.0.4’

创建一个Dao层,这里可以操作数据库,像多数据升级时,这里可以做一些特定处理。对外扩展

public class FileDao extends DefaultBaseDao {
}

@DbTable(value = “tb_file”)
public class FileModel {

@DbPrimaryField(value = “id”)
private int id;
@DbField(value = “tb_filename”)
private String fileName;
@DbField(value = “tb_filepath”)
private String filePath;
@DbField(value = “tb_fileid”)
private int fileId;

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getFilePath() {
return filePath;
}

public void setFilePath(String filePath) {
this.filePath = filePath;
}

public int getFileId() {
return fileId;
}

public void setFileId(int fileId) {
this.fileId = fileId;
}
}

@DbTable(value = “tb_user”)
public class User {

@DbPrimaryField(value = “id”)
private Integer id;
@DbField(value = “user_name”)
private String name;
@DbField(value = “user_address”)
private String address;
@DbField(value = “user_psw”)
private String psw;
@DbField(value = “user_status”)
private Integer status;
@DbField(value = “user_id”)
private String user_id;
@DbField(value = “isMe”)
private Boolean isMe;
@DbField(value = “myAge”)
private Double myAge;
@DbField(value = “myPhone”)
private Long myPhone;
@DbField(value = “aShort”)
private Short aShort;

public User(String name, String address, String psw, Integer status, String user_id, Boolean isMe, Double myAge, Long myPhone, Short aShort) {
this.name = name;
this.address = address;
this.psw = psw;
this.status = status;
this.user_id = user_id;
this.isMe = isMe;
this.myAge = myAge;
this.myPhone = myPhone;
this.aShort = aShort;
}

public User() {
}

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 String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getPsw() {
return psw;
}

public void setPsw(String psw) {
this.psw = psw;
}

public Integer getStatus() {
return status;
}

public void setStatus(Integer status) {
this.status = status;
}

public String getUser_id() {
return user_id;
}

public void setUser_id(String user_id) {
this.user_id = user_id;
}

public Boolean getMe() {
return isMe;
}

public void setMe(Boolean me) {
isMe = me;
}

public Double getMyAge() {
return myAge;
}

public void setMyAge(Double myAge) {
this.myAge = myAge;
}

public Long getMyPhone() {
return myPhone;
}

public void setMyPhone(Long myPhone) {
this.myPhone = myPhone;
}

public Short getaShort() {
return aShort;
}

public void setaShort(Short aShort) {
this.aShort = aShort;
}

@Override
public String toString() {
return “User{” +
“id=” + id +
“, name='” + name + ‘’’ +
“, address='” + address + ‘’’ +
“, psw='” + psw + ‘’’ +
“, status=” + status +
“, user_id='” + user_id + ‘’’ +
“, isMe=” + isMe +
“, myAge=” + myAge +
“, myPhone=” + myPhone +
“, aShort=” + aShort +
‘}’;
}
}

public class UserDao extends DefaultBaseDao {

// @Override
// public Long insert(User entity) {
// List list=query(new User());
// User where = null;
// for (User user:list)
// {
// where =new User();
// where.setUser_id(user.getUser_id());
// user.setStatus(0);
// Log.i(TAG,“用户”+user.getName()+“更改为未登录状态”);
// update(user,where);
// }
// Log.i(TAG,“用户”+entity.getName()+“登录”);
// entity.setStatus(1);
// return super.insert(entity);
// }

/**

  • 得到当前登录的User
  • @return
    */
    public User getCurrentUser() {
    User user=new User();
    user.setStatus(1);
    List list=query(user);
    if(list.size()>0)
    {
    return list.get(0);
    }
    return null;
    }
    }

#####具体使用

public class MainActivity extends AppCompatActivity {

private IBaseDao iBaseDao;

String dbFile;
int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//数据库地址 文件夹
dbFile = Environment.getExternalStorageDirectory().getAbsolutePath() + “/myDb”;
//6.0以上动态申请权限
PermissionUtils.getInstance().requestPermission(this);
}

public void click(View view){
switch (view.getId()){
//myselft.db数据库 添加用户
case R.id.add_user:
//建立数据库和表的链接
iBaseDao = BaseDaoFactory.getInstance().getSqliteComponent(UserDao.class,User.class,dbFile,“myselft.db”);

//iBaseDao.insert(“insert into tb_user(user_name,user_address,user_psw,user_status,user_id,isMe,myAge,myPhone,aShort) values(‘鬼刀’,‘六极之地’,‘123456’,1,‘user_90’,‘true’,1.234,457864745,1234)”);

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。

[外链图片转存中…(img-QviqoVtE-1715364586788)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值