1. 程式人生 > >GreenDao使用踩過的坑

GreenDao使用踩過的坑

getters tools 打開 cat tac 寫上 root *** mbo

本來想用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使用踩過的坑