问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android greendao 修改方法怎么写

发布网友 发布时间:2022-04-09 05:30

我来回答

2个回答

懂视网 时间:2022-04-09 09:51

: ‘libs‘, include: [‘*.jar‘]) testCompile ‘junit:junit:4.12‘ compile ‘com.android.support:appcompat-v7:23.4.0‘ compile ‘com.android.support:recyclerview-v7:23.4.0‘ apt ‘com.jakewharton:butterknife-compiler:8.1.0‘ compile ‘org.greenrobot:greendao:2.2.1‘ compile ‘com.jakewharton:butterknife:8.1.0‘ compile ‘com.apkfuns.logutils:library:1.4.2‘ compile ‘io.reactivex:rxjava:1.1.5‘ compile ‘io.reactivex:rxandroid:1.2.0‘ }

因为这部分和其他开源库 还是有点使用的小区别,我这边还是照搬下如何构建项目(隔壁搬来的)

1.首先开个项目

2.然后在.src/main下java目录同级的地方新建个目录叫java-gen

3.开完之后在build.gradle的sourceSets节点复制以下内容

 main {
  java.srcDirs = [‘src/main/java‘, ‘src/main/java-gen‘]
 }

技术分享

当然记得把前面那一堆依赖里 greenDAO相关的先build下不然 不能成

4.接下来再建我们的依赖java Module(用于创建对象和DAO代码)

5.然后在那个项目里加上generator所需的依赖,像这样

dependencies {
 compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
 compile ‘org.greenrobot:greendao-generator:2.2.0‘
}

6.然后在这个JAVA 项目里创建一个类,叫什么随你,喜欢就好。

这里贴下具体的代码

public class DemoClass {
 public static void main(String[] asa) {
 Schema schema = new Schema(1, "com.example");
 addPerson(schema);
 try {
  new DaoGenerator().generateAll(schema, "/Users/jiajiewang/Desktop/SQLDemo/app/src/main/java-gen");
 } catch (Exception e) {
  e.printStackTrace();
 }
 }

 public static void addPerson(Schema schema) {
 Entity entity = schema.addEntity("Person");
 entity.addIdProperty();
 entity.addStringProperty("Name").notNull();
 entity.addStringProperty("Age").notNull();
 entity.addStringProperty("Address");
 }
}

这里有一个Main方法,一个addPerson

这里我们先声明了一个模式对象,传入2个参数 1个是数据库版本号,1个是生成代码的路径,这个路径就是前面我们java-gen的路径(可能在运行前并没有这个路径,但是运行后就自动生成了)

然后我们再给这个模式对象构建实体,这个实体其实就是我们数据库字段所对应的对象实体。(greenDAO的一系列操作就是在操作对象)

设置完了构建完了,OK我们就“创造”代码,传入模式对象和输出路径就OK了!!

右键 run main就成了我们最上面那个包截图的样子了

里面都是些啥我这里不做过多解释,上面传送门有介绍,我们来看看具体如何使用

官方比较推荐把一系列的初始化行为放在Applicatin里,省的每个业务类都要做初始化的一些操作。

public class MyApplication extends Application {
 public DaoSession daoSession;
 public SQLiteDatabase db;
 public DaoMaster.DevOpenHelper helper;
 public DaoMaster daoMaster;

 @Override
 public void onCreate() {
 super.onCreate();
 helper = new DaoMaster.DevOpenHelper(this, "person", null);
 db = helper.getWritableDatabase();
 daoMaster = new DaoMaster(db);
 daoSession = daoMaster.newSession();
 }

 public DaoSession getDaoSession() {
 return daoSession;
 }

 public SQLiteDatabase getDb() {
 return db;
 }
}

这里主要是给予业务类获取DAO实例什么的用。

贴下运行效果(Log也可以看下不然不太好理解)

技术分享

技术分享

改(先添加了数据,然后再改)

技术分享

年纪改到了 100

技术分享

删 id为2的那一条数据

技术分享

删完了 就剩一条了

技术分享

接下来就是具体的增删查改了,因为数据库都是大消耗操作,所以这里用了 RX,不过RX玩的不溜,见谅 哈哈。

package com.wjj.demo;


public class MainActivity extends AppCompatActivity {

 @BindView(R.id.delete_id_tv)
 EditText deleteIdTv;
 private List<Person> list;
 private Cursor cursor;
 private PersonAdapter adapter;

 @BindView(R.id.add)
 Button add;
 @BindView(R.id.delete)
 Button delete;
 @BindView(R.id.edit)
 Button edit;
 @BindView(R.id.query)
 Button query;
 @BindView(R.id.recyclerView)
 RecyclerView recyclerView;
 @BindView(R.id.input_name)
 EditText inputName;
 @BindView(R.id.input_address)
 EditText inputAddress;
 @BindView(R.id.input_age)
 EditText inputAge;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 ButterKnife.bind(this);
 //初始化游标
 cursor = getDb().query(getPersonDao().getTablename(), getPersonDao().getAllColumns(), null, null, null, null, null);
 list = new ArrayList<>();
 adapter = new PersonAdapter(MainActivity.this, list);
 recyclerView.setAdapter(adapter);
 recyclerView.setLayoutManager(new LinearLayoutManager(this));
 }

 //返回Dao对象
 private PersonDao getPersonDao() {
 return ((MyApplication) this.getApplicationContext()).getDaoSession().getPersonDao();
 }

 //返回数据库对象
 private SQLiteDatabase getDb() {
 // 通过 BaseApplication 类提供的 getDb() 获取具体 db
 return ((MyApplication) this.getApplicationContext()).getDb();
 }

 @OnClick({R.id.add, R.id.delete, R.id.edit, R.id.query})
 public void onClick(View view) {
 switch (view.getId()) {
  case R.id.add:
  addPerson();
  break;
  case R.id.delete:
  String v = deleteIdTv.getText().toString().trim();
  if (v.length() > 0) {
   deletePerson(Long.parseLong(v));
  } else {
   LogUtils.e( "---> 删除所需的TextView值为空");
  }
  break;
  case R.id.edit:
  String age = inputAge.getText().toString().trim();
  editPerson(age);
  inputAge.setText("");
  break;
  case R.id.query:
  list.clear();
  queryPerson();
  break;
 }
 }

 //增
 private void addPerson() {
 Observable.create(new Observable.OnSubscribe<Person>() {

  @Override
  public void call(Subscriber<? super Person> subscriber) {
  Person person = null;
  String age = inputAge.getText().toString().trim();
  String name = inputName.getText().toString().trim();
  String address = inputAddress.getText().toString().trim();
  //判断不为空
  if (address.length() > 0 && name.length() > 0 && age.length() > 0) {
   person = new Person(null, name, age, address);
   getPersonDao().insert(person);
   cursor.requery();

  } else {
   LogUtils.d("---> 有一个/多个输入框里没东西");
  }
  if (person != null) {
   subscriber.onNext(person);
  } else {
   Observable.error(new NullPointerException("person为空"));
  }

  LogUtils.d("---> add 新线程" + Thread.currentThread().getId());
  }
 }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Person>() {
  @Override
  public void onCompleted() {

  }

  @Override
  public void onError(Throwable e) {
  LogUtils.e(e);
  }

  @Override
  public void onNext(Person person) {
  inputAddress.setText("");
  inputAge.setText("");
  inputName.setText("");
  }
 });
 }

 //查
 private void queryPerson() {
 Observable.create(new Observable.OnSubscribe<String>() {
  @Override
  public void call(Subscriber<? super String> subscriber) {
  String age = inputAge.getText().toString().trim();
  String name = inputName.getText().toString().trim();
  String address = inputAddress.getText().toString().trim();
  //判断是否有东西
  if (name.length() > 0) {
   queryLogic(name, 1);
   subscriber.onNext(name);
  } else if (age.length() > 0) {
   queryLogic(age, 3);
   subscriber.onNext(age);
  } else if (address.length() > 0) {
   subscriber.onNext(address);
   queryLogic(address, 2); // Query 类代表了一个可以被重复执行的查询
  } else {
   LogUtils.d("有一个/多个输入框里没东西");
  }
  subscriber.onCompleted();
  }
 }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
  @Override
  public void onCompleted() {
  adapter.notifyDataSetChanged();
  }

  @Override
  public void onError(Throwable e) {
  LogUtils.e(e);
  }

  @Override
  public void onNext(String s) {
  inputAge.setText("");
  inputAddress.setText("");
  inputName.setText("");
  }
 });
 }

 private void queryLogic(String value, int type) {
 Query query = null;
 switch (type) {
  case 1:
  // Query 类代表了一个可以被重复执行的查询
  query = getQuery(value, PersonDao.Properties.Name);
  break;
  case 2:
  query = getQuery(value, PersonDao.Properties.Address);
  break;
  case 3:
  query = getQuery(value, PersonDao.Properties.Age);
  break;
 }
 if (query != null) {
  // 查询结果以 List 返回
  List<Person> queryList = (List<Person>) query.list();
  list.addAll(queryList);
  LogUtils.d("--->有" + queryList.size() + "个值");
 }

 }

 private Query getQuery(String value, Property p) {
 Query query = null;
 query = getPersonDao().queryBuilder()
  //逻辑
  .where(p.eq(value))
  //排序
  .orderAsc(PersonDao.Properties.Id)
  .build();
 return query;

 }

 //删
 private void deletePerson(long value) {
 Observable.just(value).subscribeOn(Schedulers.io()).map(new Func1<Long, Long>() {
  @Override
  public Long call(Long aLong) {
  getPersonDao().deleteByKey(aLong);
  return aLong;
  }
 }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {
  @Override
  public void call(Long aLong) {
  deleteIdTv.setText("");
  }
 });


 }

 //改
 private void editPerson(String age) {
 Observable.just(age).subscribeOn(Schedulers.io()).map(new Func1<String, Person>() {
  @Override
  public Person call(String s) {
  Person person = new Person();
  person.setAddress("suzhou");
  person.setAge(s);
  person.setName("kobe");
  person.setId(3l);
  getPersonDao().update(person);
  return person;
  }
 }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Person>() {
  @Override
  public void call(Person person) {
  LogUtils.d(person);
  }
 });
 }

}

上面这些业务代码比较简单,这里不做太多介绍,这里讲一下这些sql操作的方法哪来的

我们这些 数据库操作的方法来自多个类,但是实现类是我们一直在get的PersonDao

PersonDao extends AbstractDao<Person, Long>

所以其实这些sql方法都来源于 public abstract class AbstractDao<T, K>

一看到抽象类就懂了,给我们拿来使的。 里面有一大堆 public protected的方法,这个大家自己去看就行。

总结:

我对greenDAO内部实现不是太清楚,但是大量的测评和使用好评率让我们可以放心食用,接下来一段时间还会继续啃ORM,会不会对这部分最 2 3 4期的分析看情况吧。

如果英文好的可以看http://greenrobot.org/greendao/documentation/how-to-get-started/ 学创建流程。

源码地址:https://github.com/ddwhan0123/GreenDaoDemo
下载地址:https://github.com/ddwhan0123/GreenDaoDemo/archive/master.zip

暂时还是待业,有坑的带我啊!!!

技术分享

数据库那些事--greenDAO增删查改

标签:

热心网友 时间:2022-04-09 06:59

关于greenDao的使用
第一篇How to get started ?

原文地址:http://green-orm.com/documentation/how-to-get-started/
该教程会带你浏览一个简单的greenDao示例工程。地址:https://github.com/greenrobot/greenDAO,该工程包含两个子工程:
DaoExample和DaoExampleGenerator。你可以clone到本地,运行或者直接在github上直接浏览。
如果你从git仓储中检出了DaoExample,可以直接像Android应用一样运行它。正如你所看到的,它就是一个简单的笔记本。可以添加新的note,
或者点击已存在的note进行删除。

预生成代码和创建表
在src-gen目录下,你可以找到一些已经生成的文件
1)Note.java 一个包含一个Note所有数据的java类。
2)NoteDao.java 一个DAO类,是操作Note 对象的接口。
你可以通过DaoExampleGenerator工程再次生成Note和NoteDao。
使用DaoMaster类可以获得一个方便的SQLiteOpenHelper:
new DaoMaster.DevOpenHelper(this, "notes-db", null)
你不必编写“CREATE TABLE” SQL语句,greenDao会为你完成。

插入和删除Note对象
创建了Note表后,就可以存储一些note到数据库里了。这是在NoteActivity类里完成的。在onCreate方法里,我们准备了一个DAO对象:
1 2 3 Master = new DaoMaster(db); Session = Master.newSession(); noteDao = Session.getNoteDao();
添加一个新的note到数据库中:
1 2 3 Note note = new Note(null, noteText, comment, new Date()); noteDao.insert(note); Log.d("DaoExample", "Inserted new note, ID: " + note.getId());
该示例只是创建并插入了一个java对象。但insert方法返回的时候,数据库的ID已经分发到了刚插入的Note对象上了。在log中可以看到。

删除一条note:非常简单明,在onListItemClick方法中可以看到
1 noteDao.deleteByKey(id);
你也可以看一下其它的DAO方法:loadAll、update。

数据模型化和代码的生成
为了扩展note或者创建新的实体,你可以看一下DaoExampleGenerator工程。它包含了一个单例的类,该类中包含了数据模型的定义代码。
1 2 3 4 5 6 7 Schema schema = new Schema(1, "de.greenrobot.example"); Entity note= schema.addEntity("Note");note.addIdProperty(); note.addStringProperty("text").notNull(); note.addStringProperty("comment");note.addDateProperty("date"); new DaoGenerator().generateAll("../DaoExample/src-gen", schema);

正如你所看到的,你可以创建一个Schema对象,通过它你可以添加实体,一个实体连接了一张数据库表。
一个实体包含一些属性,它们可以被映射到数据库的columns。
一旦schema定义完成,你可以触发代码生成器,Note.java和NoteDao.java文件就是这样被创建的。

下一步:
对greenDao有了初步的了解,你可以自己动手试试了。当然,请查看下文档http://green-orm.com/documentation/,
如果没有找到你想要的,可以使用support options

第二篇 介绍
GreenDao是一个用于Android开发的对象/关系映射(ORM)工具。它向SQLite数据库提供了一个对象导向的接口。像GreenDao这样的ORM工具不仅为你省去了很多的重复工作,而且提供了更简便的操作接口。
代码生成的工程结构图

为了在你的Android项目中使用GreenDao,你需要创建一个二级工程:“generator project”,它的任务就是为你的domain生成具体的代码。这个生成器工程就是一个普通的java工程。确保greenDao 的greenDao-generator.jar和 freemarker.jar 在classpath中。创建一个可执行的java类,构建你的实体模型并触发代码生成器,更多细节,可以参看 modelling文档。
核心类
一旦生成了指定的代码,就可以在你的android工程中使用greenDao了。别忘记在你的android工程中引入greenDao的核心jar包:greenDao.jar。以下是GreenDao的一些必要接口。

DaoMaster:

master以一定的模式持有数据库对象(SQLiteDatabase)并管理一些DAO类(而不是对象)。
有一个静态的方法创建和drop数据库表。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式。

DaoSession:

管理指定模式下所有可用的DAO对象,你可以通过某个get方法获取到。DaoSession提供一些通用的持久化方法,比如对实体进行插入,加载,更新,刷新和删除。最后DaoSession对象会跟踪identity scope,更多细节,可以参看 session文档。

DAOs(Data access objects):

数据访问对象,用于实体的持久化和查询。对于每一个实体,greenDao会生成一个DAO,相对于DaoSession它拥有更多持久化的方法,比如:加载全部,插入(insertInTx,语境不明了,暂且简单的翻译成插入)。

实体
可持久化的对象。通常,实体可以被生成,不用手动去写。在数据库的行中,使用的都是标准的java对象的属性(比如POJO或者JavaBean)。
1 2 3 4 user.addIdProperty(); user.addStringProperty("name"); user.addStringProperty("password");user.addIntProperty("yearOfBirth");
在示例中有一个Note实体,通过它的DAO,我们可以对指定的实体进行持久化的操作。

第三篇 实体的模型化
使用greenDao的第一步:创建一个代表持久化数据的实体模型。greenDao会依赖该模型为Dao生成java代码。
该模型本身是用java代码定义的,很简单:在DaoExampleGenerator工程的基础上创建一个java对象。具体你可以参看:
http://green-orm.com/documentation/how-to-get-started/

下面的插图描绘了元模型,展示了一些用于描述domain具体模型的类。

Schema

实体数据schema是你定义的第一个对象,通过schema的版本和缺省的java包调用构造器。
1 Schema schema = new Schema(1, "de.greenrobot.example");
这个缺省的java包会在greenDao生成实体、DAOs、和JUnit测试的时候使用。如果那些缺省值是正确的,那么就完成了第一步。

如果你希望将DAO和测试类创建到不同的包中,可以重新定义schema的定义代码:
1 2 schema.setDefaultJavaPackageTest("de.greenrobot.example.test");schema.setDefaultJavaPackageDao("de.greenrobot.example.");
对于实体,该schema也有两个缺省的标记,它们是可以被复写的。这些标记可以区分实体是否是激活状态,是否应该使用sections。这些特性在文档里并没有,你可以看一下发布源码中的测试工程。
1 2 schema2.enableKeepSectionsByDefault(); schema2.enableActiveEntitiesByDefault();
实体
一旦你拥有了一个schema对象,你就可以使用它去添加实体了。
1 Entity user = schema.addEntity("User");
一个实体有不同的可变更设置,更重要的是,你可以添加一些属性到实体。
1 2 3 4 user.addIdProperty(); user.addStringProperty("name"); user.addStringProperty("password");user.addIntProperty("yearOfBirth");
除了实体,还可以添加,一对一和一对多的关系。

属性和主键

以上的实体部分展示了如何给一个实体添加属性,实体的addXXXProperty方法返回一个PropertyBuilder对象,可以用于配制属性,
例如,使用columnName去复写缺省的或者你提供的column name。在ProperyBuilder对象上调用getProperty方法去访问属性对象,

对于指数(indices )和关系的创建是有必要的。

创建主键的约束
现在实体必须拥有一个long或者Long类型的属性作为它们的主键,这是Android和SQLite推荐的实践方式。因为,在将来,greenDao要准备处理很多主键的脚本,但并不是每件事都能完全实现。为了解决这个问题,你可以使用一个long类型的键并且使用一个唯一的下标去处理这个预期的key属性。

缺省
greenDao会尝试以合理的缺省值进行工作,所以开发者不用单个的配置它们。比如,表和其列名是从实体和属性名中获取到的,而不是java中的驼峰。缺省的数据库名是大写的,单词间用下划线分隔开。比如:属性“creationDate”在数据库列中的映射为“CREATION_DATE”,

关系

一对多和多对多的关系在http://green-orm.com/documentation/relations/中有注释。

继承、接口、序列化
实体可以从其他非实体类继承,其父类可以通过setSuperclass(String)方法指定,注意:它可能会有其它的实体作为父类(但这里没有多态查询)。
比如:
1 myEntity.setSuperclass("MyCommonBehavior");
通常,使用接口作为实体属性和行为的通用基类是比较好的。比如:一个实体A和B共享了一套属性,这些属性可以定义在C中。下面是一个序列化B的列子:
1 2 3 entityA.implementsInterface("C"); entityB.implementsInterface("C"); entityB.implementsSerializable();

触发生成器
一旦你的实体schema放置好了,你可以触发代码生成器进行处理。在generator工程中,你可以实例化DaGenerator并调用generateAll中的一个方法:
1 2 DaoGenerator Generator = new DaoGenerator(); Generator.generateAll(schema, "../MyProject/src-gen");
你所需要的就是schema对象和目标文件夹,通常该文件夹就是你android工程的资源文件夹。如果你想把这些测试类放到其他目录下,可以把目的文件夹作为第三个参数传入。

保持独立性(Keep sections 保持自定义的代码不会被覆盖)
实体类在每一次生成器运行的时候都会被覆盖。greenDao允许添加自定义的代码到实体,通过“keep” ,可以满足它们。在schema中使用enableKeepSectinsByDefault(),或者setHasKeepSections(true)在选中的实体中。一旦使用,3个独立的部分会在实体中生成:
1 2 3 4 5 6 7 8 // KEEP INCLUDES - put your custom includes here // KEEP INCLUDES END ... // KEEP FIELDS - put your custom fields here // KEEP FIELDS END ... // KEEP METHODS - put your custom methods here // KEEP METHODS END

现在,你可以在 KEEP [...] and KEEP [...] END.中写入你的代码。注意,不要修改KEEP注释。在该范围的代码会在代码重新生成的时候不被覆盖。对于备份或者提交代码时出现的意外错误,这是一个不错的选择解决方案。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
谁能给个单机版的风云之雄霸天下啊?? 求风云雄霸天下PC单机游戏WIN7版 雄霸天下任务指南 开心网001老房子卖了以后家具还有吗? 为什么001开心网买房子组件删除仓库里的东西都没了 请教一下,开心001的开心庄园里面的建材有好多富余的的 除了5元一个卖... 开心网001小号怎么给大号送房子? 开心网001多少级能送别人房子?多少级能接受别人给的房子? 开心网001果实或家具能送人吗 开心网(kaixin001)怎么买外地房子? 小学能力培养与测试,数学,人教版六年级下册第六页四五题的答案 天龙八部3里,他们说丐帮进阶后,棒打狗头时间和凌波微步时间差不多,为什么我的还有140多秒冷却时间啊! 六年级上册能力培养与测试第70、7l、72、页答案 写狗的作文有没有啊,急啊,1介绍 2用一件事说明狗狗怎么样 3总结 450字左右 小学六年级上册数学能力培养与测试的 圆的周长第1课时第4,5小题怎么写的 凌波微步专解跑狗图是什么? 六年级上册数学能力培养与测试人民教育出版社第40页,42页,44页的全部答案。 六年级上册数学《能力培养与测试》第17页答案,急啊~~~急急急急~限30分钟内回答 天龙3 逍遥的凌波微步最短冷却是几秒、要多少的心法 我那本书丶到80了冷却是12秒 以后还可能再减cd吗? 我用金山一升级就卡的不行,有什么好的杀毒软件推荐一下啊。 狗四蹄乱蹬是什么病? 崔百泉的叙述中在钻研凌波微步的人是谁 什么杀毒软件好? 中兴LTE测试用的加密狗多少钱一个 求高人解梦~~~ 梦见和一群女人在水里走我的一双鞋掉了 梦见自己被别人拉着往汹涌的海里走? 梦见和一个异性一起去游泳,他独自游走,只剩下我一个人在岸边是什么寓意... 已婚女人梦到和别的男人走在河里 怎么设置玩游戏时别人打电话打不进来? 街头篮球怎么帽凌波微步? 六年级下册人教版数学能力培养与测试33页至34页答案全部 左右互搏和空名明哪个厉害些?凌波微步学会了有什么用? 数学六年级下册能力培养与测试24页 六年级下册数学能力培养与测试人民教育出版社19页怎么写? 中国邮政储蓄银行在哪里 可以在邮政储蓄银行寄快递吗,和邮局是一个地方吗 在小家庭做牛排都需要什么?有会做的吗?请教授制作过程! 农历毎年八月廿三是什么菩萨生日? 8月23日的节日风俗 网络机顶盒需要开通吗 2012年8月23日是什么日子?是情人节嘛?七夕? 网络机顶盒需要开通吗? 今年8月23号是什么日子? 用网络机顶盒看电视需要到电信开通什么业务吗? 机顶盒需要开通才能看电视么? 今年八月二十三号是什么日子。。。 中国电信IPTV网络机顶盒需要开通吗 8月23号是个好日子吗? 张林,网络电视机顶盒需要开通网络电视功能吗