本来想用litePal,看了郭大婶的说明,真的是好用!

后来发现网上说比较流行的还是 GREENDAO,且效率不错!

不用管那么多了,直接用吧.

----------------------------------------------------------------------------------

看了一天的 GREENDAO,还是没有敢动手,那就动起来!

----------------------------------------------------------------------------------

1.先导入包,直接按官网来

-------------------------

// In your root build.gradle file:  项目的 build.gradle
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
} // In your app projects build.gradle file: 应用程序的 build.gradle
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}

导入结束,高高兴兴的准备在application 中加入 daoMaster daoSession

private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;

这里还有个小插曲:不要笑我笨!

我根本找不到   application 类在哪???

后来,一个大兄弟告诉我,那需要你自己写个 应用类,,继承application ,大概长这样:

import android.app.Application;

/**
* Created by Think on 2017/12/21.
*/ public class BaseApp extends Application { @Override
public void onCreate() {
super.onCreate();
}
}

建立完app后还要在 AndroidManifest.xml 中加入  name='BaseApp'

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ssqhan.mydbtest"> <application
android:name="BaseApp"
............................
.
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

好吧,快写上内容:(官网是这样要求的)

// do this once, for example in your Application class           这不,,要求写到应用程序中
helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
// do this in your activities/fragments to get hold of a DAO
noteDao = daoSession.getNoteDao();
//那我们就这样写了
//----------------------------------------------
import android.app.Application; /**
* Created by Think on 2017/12/21.
*/ public class BaseApp extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
// do this once, for example in your Application class
mHelper= new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
mDaoMaster= new DaoMaster(db);
mDaoSession=mDaoMaster.newSession(); // do this in your activities/fragments to get hold of a DAO
noteDao = daoSession.getNoteDao();
@Override public void onCreate()
{ super.onCreate(); }
}

可是会发现, DAOMaster  是红色的 且出现:  cannot resolve symbol 'daoMaster'

why???????????

----------------------------------------------------------------------------------------------------

2.正确姿势就该这样:

(1)先建一个实体这样:(直接COPY 官网上的)

@Entity
public class User {
@Id
private Long id; private String name; @Transient
private int tempUsageCount; // not persisted // getters and setters for id and user ...
}

什么,又是一片红:    一通  'alt+enter'  解决问题

(2) 这样就自动生成三个文件

我当时现现了另一个神级的错误:  三个文件最上面出现 package;   并且标红

   解决方法:直接删除  package

     (后来发现,删除是不对的,没有能正确的生成包名是因为  User  实体的位置放置不对,所以生成的  DaoMaster,DaoSession,UserDao 的包名都不正确)

又发现:userDao里的 User又标红   'alt+enter' 直接 import  User就可以了!

现在才刚刚开始!

-------------------------------------------------------------------------------------------------------

3.写入全局应用程序中

终于不再看到 标红的 字样了..真的有点崩溃了!

再来看看:

public class BaseApp extends Application {

    private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession; @Override
public void onCreate() {
super.onCreate(); mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
// do this in your activities/fragments to get hold of a DAO 既然要在 activities 里,那这里就不用了
//noteDao = mDaoSession.getNoteDao(); }
}

好了.没有标红,我的个小心脏啊..真的有点受不了了!

好吧,还是让代码看来起更优雅一点(借用大侠的代码,地址:http://www.jianshu.com/p/4986100eff90):

public class BaseApp extends Application {

    private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static BaseApp instances; @Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
} public static BaseApp getInstances(){
return instances;
} /**
* 设置greenDao
*/
private void setDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}

上面说了,那句话要在 activity 里,那就打开主activity.

-------------------------------------------------------------------------------------

4. 主activity中加入实体操作

该怎么写呢?  以下这样,出错了,看标红:

那又该如何做????   脑袋中直冒金星!!!

*****************************************************************************

经过多方测试,发现我的User 实体放的位置不对!应该放到 JAVA下面的 COM.example.***下面,再 build project这样就不会有问题了。

正确的姿势应该这样:

package com.example.ssqhan.mydbtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView; import org.greenrobot.greendao.query.QueryBuilder; import java.util.List; public class MainActivity extends AppCompatActivity {
MenuDao mMenuDao;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
creatTable();
tv=findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
QueryBuilder<Menu> queryMenu = mUserDao.queryBuilder();
queryMenu.where(MenuDao.Properties.Id.eq(1));
List<Menu> list = queryMenu.list();
tv.setText((list.get(0)).getName());
}
});
}
public void creatTable(){
mMenuDao = BaseApp.getInstances().getDaoSession().getMenuDao();
Menu menu = new Menu((long)1,"MenuItem");
mMenuDao.insert(menu);
}
}

上面的代码,,点击运行,答案出来了。。。tv的text 变成了  MenuItem(我把User实体换成了Menu)  别的都一样!

GreenDao使用踩过的坑的更多相关文章

  1. 项目中踩过的坑之-sessionStorage

    总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...

  2. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

  3. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  4. 【转载】Fragment 全解析(1):那些年踩过的坑

    http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...

  5. Redis Cluster踩过的坑

    Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops

  6. 第八篇:web之前端踩的一些坑

    前端踩的一些坑   前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...

  7. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  8. 那些年踩过的坑之:first-child伪类选择器

    原文:那些年踩过的坑之:first-child伪类选择器 :first-child 选择器用于选取属于其父元素的首个子元素的指定选择器.——w3school 嗯,乍一看好像说的不是很明白,因此这个选择 ...

  9. 《C++之那些年踩过的坑(二)》

    C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...

随机推荐

  1. sublime插件insertDate显示ISO时间

    1 下载insertDate插件以及安装完毕 2 把光标放在想插入ISO时间的地方 3 按住:alt+f5,之后,在sublime下面的Date format string输入:iso.之后按ente ...

  2. 普通项目转为maven项目及相关操作说明

    普通项目转为maven项目及相关操作说明 1 原项目简述 如图,一般的项目大致包括三类路径:src,源码路径:test,单元测试路径:lib第三方类包路径. 示例项目中,BaseDao类依赖于mysq ...

  3. DataGridColum的bug

    Datagrid有多个bug: 1,不支持DynamicResource的东西 2, 在Column隐藏后再显示, ColumnHeader的Tag或者DataContext为null. 解决办法: ...

  4. 《TCP/IP详解卷一:协议》数据链路层(一)

    版权声明:本文为博主原创文章,转载请标注转载链接,谢谢.   目录(?)[+]   引言         在TCP/IP协议族中,链路层主要有三个目的: 为IP模块发送和接收IP数据报. 为ARP模块 ...

  5. HTML DOM nodeType 属性

    实例 获得 body 元素的节点类型: document.body.nodeType; 结果: 1 定义和用法 nodeType 属性返回以数字值返回指定节点的节点类型. 如果节点是元素节点,则 no ...

  6. Lagom学习 六 Akka Stream

    lagom中的stream 流数据处理是基于akka stream的,异步的处理流数据的.如下看代码: 流式service好处是: A: 并行:  hellos.mapAsync(8, name -& ...

  7. Linux 包管理基础:apt、yum、dnf 和 dpkg

    https://linux.cn/article-8782-1.html 1. apt-get 安装( 在线) 会帮我把所有的依赖包都一起安装 apt-get install xxx 安装xxx .如 ...

  8. ACM实用C语言函数

    函数名: abs 功 能: 求整数的绝对值 用 法: int abs(int i); 程序例: #include <stdio.h> #include <math.h> int ...

  9. caffe c++

    http://blog.csdn.net/yao_zhuang/article/details/1853625

  10. GridSplitter用法

    1.GridSplitter的ShowsPreview设置为True时拖动报null错误 解决方法在Grid外面包装一个装饰器:AdornerDecorator,至于为什么这么做,暂时还不知道 2.当 ...