转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39122981,本文出自【张鸿洋的博客】

上一篇已经对ORMLite框架做了简单的介绍:Android ORMLite 框架的入门用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用法。

通过上一篇的了解,我们使用ORMLite,需要自己写一个DatabaseHelper去继承OrmLiteSqliteOpenHelper,下面我们首先给出一个我认为比较靠谱的Helper的写法:

1、DatabaseHelper

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.zhy.zhy_ormlite.db;

- 
- <span class="keyword">import</span> java.sql.SQLException;

- <span class="keyword">import</span> java.util.HashMap;

- <span class="keyword">import</span> java.util.Map;

- 
- <span class="keyword">import</span> android.content.Context;

- <span class="keyword">import</span> android.database.sqlite.SQLiteDatabase;

- 
- <span class="keyword">import</span> com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;

- <span class="keyword">import</span> com.j256.ormlite.dao.Dao;

- <span class="keyword">import</span> com.j256.ormlite.support.ConnectionSource;

- <span class="keyword">import</span> com.j256.ormlite.table.TableUtils;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.Article;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.Student;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.User;

- 
- <span class="keyword">public</span>  <span class="keyword">class</span> DatabaseHelper <span class="keyword">extends</span> OrmLiteSqliteOpenHelper

- {

- <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String TABLE_NAME = <span class="string">&#8220;sqlite-test.db&#8221;</span>;

- 
- <span class="keyword">private</span> Map<String, Dao> daos = <span class="keyword">new</span> HashMap<String, Dao>();

- 
- <span class="keyword">private</span> DatabaseHelper(Context context)

- {

- <span class="keyword">super</span>(context, TABLE_NAME, <span class="keyword">null</span>, <span class="number">4</span>);

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onCreate(SQLiteDatabase database,

- ConnectionSource connectionSource)

- {

- <span class="keyword">try</span>

- {

- TableUtils.createTable(connectionSource, User.<span class="keyword">class</span>);

- TableUtils.createTable(connectionSource, Article.<span class="keyword">class</span>);

- TableUtils.createTable(connectionSource, Student.<span class="keyword">class</span>);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> onUpgrade(SQLiteDatabase database,

- ConnectionSource connectionSource, <span class="keyword">int</span> oldVersion, <span class="keyword">int</span> newVersion)

- {

- <span class="keyword">try</span>

- {

- TableUtils.dropTable(connectionSource, User.<span class="keyword">class</span>, <span class="keyword">true</span>);

- TableUtils.dropTable(connectionSource, Article.<span class="keyword">class</span>, <span class="keyword">true</span>);

- TableUtils.dropTable(connectionSource, Student.<span class="keyword">class</span>, <span class="keyword">true</span>);

- onCreate(database, connectionSource);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- }

- 
- <span class="keyword">private</span> <span class="keyword">static</span> DatabaseHelper instance;

- 
- <span class="comment">/**</span>

- <span class="comment">     * 单例获取该Helper</span>

- <span class="comment">     * </span>

- <span class="comment">     * @param context</span>

- <span class="comment">     * @return</span>

- <span class="comment">     */</span>

- <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">synchronized</span> DatabaseHelper getHelper(Context context)

- {

- context = context.getApplicationContext();

- <span class="keyword">if</span> (instance == <span class="keyword">null</span>)

- {

- <span class="keyword">synchronized</span> (DatabaseHelper.<span class="keyword">class</span>)

- {

- <span class="keyword">if</span> (instance == <span class="keyword">null</span>)

- instance = <span class="keyword">new</span> DatabaseHelper(context);

- }

- }

- 
- <span class="keyword">return</span> instance;

- }

- 
- <span class="keyword">public</span> <span class="keyword">synchronized</span> Dao getDao(Class clazz) <span class="keyword">throws</span> SQLException

- {

- Dao dao = <span class="keyword">null</span>;

- String className = clazz.getSimpleName();

- 
- <span class="keyword">if</span> (daos.containsKey(className))

- {

- dao = daos.get(className);

- }

- <span class="keyword">if</span> (dao == <span class="keyword">null</span>)

- {

- dao = <span class="keyword">super</span>.getDao(clazz);

- daos.put(className, dao);

- }

- <span class="keyword">return</span> dao;

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 释放资源</span>

- <span class="comment">     */</span>

- <span class="annotation">@Override</span>

- <span class="keyword">public</span> <span class="keyword">void</span> close()

- {

- <span class="keyword">super</span>.close();

- 
- <span class="keyword">for</span> (String key : daos.keySet())

- {

- Dao dao = daos.get(key);

- dao = <span class="keyword">null</span>;

- }

- }

- 
- }

1、整个DatabaseHelper使用单例只对外公布出一个对象,保证app中只存在一个SQLite Connection , 参考文章:http://www.touchlab.co/2011/10/single-sqlite-connection/

2、我们对每个Bean创建一个XXXDao来处理当前Bean的数据库操作,当然真正去和数据库打交道的对象,通过上面代码中的getDao(T t)进行获取

getDao为一个泛型方法,会根据传入Class对象进行创建Dao,并且使用一个Map来保持所有的Dao对象,只有第一次调用时才会去调用底层的getDao()。

2、Bean的Dao

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.zhy.zhy_ormlite.db;

- 
- <span class="keyword">import</span> java.sql.SQLException;

- 
- <span class="keyword">import</span> android.content.Context;

- 
- <span class="keyword">import</span> com.j256.ormlite.dao.Dao;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.User;

- 
- <span class="keyword">public</span> <span class="keyword">class</span> UserDao

- {

- <span class="keyword">private</span> Context context;

- <span class="keyword">private</span> Dao<User, Integer> userDaoOpe;

- <span class="keyword">private</span> DatabaseHelper helper;

- 
- <span class="keyword">public</span> UserDao(Context context)

- {

- <span class="keyword">this</span>.context = context;

- <span class="keyword">try</span>

- {

- helper = DatabaseHelper.getHelper(context);

- userDaoOpe = helper.getDao(User.<span class="keyword">class</span>);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 增加一个用户</span>

- <span class="comment">     * @param user</span>

- <span class="comment">     */</span>

- <span class="keyword">public</span> <span class="keyword">void</span> add(User user)

- {

- <span class="keyword">try</span>

- {

- userDaoOpe.create(user);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- 
- }<span class="comment">//&#8230;other operations</span>

- 
- 
- }

我们的所有的XXXDao遵循以上的风格~

好了,基本了解了我们的代码的结构~~ps:如果觉得不合理可以留言指出,如果觉得不能接收,直接忽略。。。

3、ORMLite外键引用

现在我们有两张表一张User,一张Article;

Article中当然需要存储User的主键,作为关联~~那么在ORMLite中如何做到呢?

可能有人会直接在Article中声明一个int类型userId属性,当作普通属性处理搞定,这种做法并没有做,但是没有体现出面向对象的思想。

面向对象是这样的:Article属于某个User

类这么定义:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_3">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.zhy.zhy_ormlite.bean;

- 
- <span class="keyword">import</span> com.j256.ormlite.field.DatabaseField;

- <span class="keyword">import</span> com.j256.ormlite.table.DatabaseTable;

- 
- <span class="annotation">@DatabaseTable</span>(tableName = <span class="string">&#8220;tb_article&#8221;</span>)

- <span class="keyword">public</span> <span class="keyword">class</span> Article

- {

- <span class="annotation">@DatabaseField</span>(generatedId = <span class="keyword">true</span>)

- <span class="keyword">private</span> <span class="keyword">int</span> id;

- <span class="annotation">@DatabaseField</span>

- <span class="keyword">private</span> String title;

- <span class="annotation">@DatabaseField</span>(canBeNull = <span class="keyword">true</span>, foreign = <span class="keyword">true</span>, columnName = <span class="string">&#8220;user_id&#8221;</span>)

- <span class="keyword">private</span> User user;

- 
- <span class="keyword">public</span> <span class="keyword">int</span> getId()

- {

- <span class="keyword">return</span> id;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setId(<span class="keyword">int</span> id)

- {

- <span class="keyword">this</span>.id = id;

- }

- 
- <span class="keyword">public</span> String getTitle()

- {

- <span class="keyword">return</span> title;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setTitle(String title)

- {

- <span class="keyword">this</span>.title = title;

- }

- 
- <span class="keyword">public</span> User getUser()

- {

- <span class="keyword">return</span> user;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setUser(User user)

- {

- <span class="keyword">this</span>.user = user;

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> String toString()

- {

- <span class="keyword">return</span> <span class="string">&#8220;Article [id=&#8221;</span> + id + <span class="string">&#8220;, title=&#8221;</span> + title + <span class="string">&#8220;, user=&#8221;</span> + user

- + <span class="string">&#8220;]&#8221;</span>;

- }

- 
- }

不会去定义一个int类型的userId,而是直接定义一个User成员变量,表示本Article属于该User;

然后在User user属性上添加: @DatabaseField(canBeNull = true, foreign = true, columnName = “user_id”)

canBeNull -表示不能为null;foreign=true表示是一个外键;columnName 列名

User类暂且就两个属性:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_4">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.zhy.zhy_ormlite.bean;

- 
- <span class="keyword">import</span> com.j256.ormlite.field.DatabaseField;

- <span class="keyword">import</span> com.j256.ormlite.table.DatabaseTable;

- 
- <span class="annotation">@DatabaseTable</span>(tableName = <span class="string">&#8220;tb_user&#8221;</span>)

- <span class="keyword">public</span> <span class="keyword">class</span> User

- {

- <span class="annotation">@DatabaseField</span>(generatedId = <span class="keyword">true</span>)

- <span class="keyword">private</span> <span class="keyword">int</span> id;

- <span class="annotation">@DatabaseField</span>(columnName = <span class="string">&#8220;name&#8221;</span>)

- <span class="keyword">private</span> String name;

- 
- 
- <span class="keyword">public</span> User()

- {

- }

- 
- <span class="keyword">public</span> <span class="keyword">int</span> getId()

- {

- <span class="keyword">return</span> id;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setId(<span class="keyword">int</span> id)

- {

- <span class="keyword">this</span>.id = id;

- }

- 
- <span class="keyword">public</span> String getName()

- {

- <span class="keyword">return</span> name;

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> setName(String name)

- {

- <span class="keyword">this</span>.name = name;

- }

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> String toString()

- {

- <span class="keyword">return</span> <span class="string">&#8220;User [id=&#8221;</span> + id + <span class="string">&#8220;, name=&#8221;</span> + name

- + <span class="string">&#8220;]&#8221;</span>;

- }

- 
- 
- 
- 
- 
- }

现在看我们的ArticleDao

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_5">
    </embed>
  </div>
</div>
- <span class="keyword">package</span> com.zhy.zhy_ormlite.db;

- 
- <span class="keyword">import</span> java.sql.SQLException;

- <span class="keyword">import</span> java.util.List;

- 
- <span class="keyword">import</span> android.content.Context;

- 
- <span class="keyword">import</span> com.j256.ormlite.dao.Dao;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.Article;

- <span class="keyword">import</span> com.zhy.zhy_ormlite.bean.User;

- 
- <span class="keyword">public</span> <span class="keyword">class</span> ArticleDao

- {

- <span class="keyword">private</span> Dao<Article, Integer> articleDaoOpe;

- <span class="keyword">private</span> DatabaseHelper helper;

- 
- <span class="annotation">@SuppressWarnings</span>(<span class="string">&#8220;unchecked&#8221;</span>)

- <span class="keyword">public</span> ArticleDao(Context context)

- {

- <span class="keyword">try</span>

- {

- helper = DatabaseHelper.getHelper(context);

- articleDaoOpe = helper.getDao(Article.<span class="keyword">class</span>);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 添加一个Article</span>

- <span class="comment">     * @param article</span>

- <span class="comment">     */</span>

- <span class="keyword">public</span> <span class="keyword">void</span> add(Article article)

- {

- <span class="keyword">try</span>

- {

- articleDaoOpe.create(article);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 通过Id得到一个Article</span>

- <span class="comment">     * @param id</span>

- <span class="comment">     * @return</span>

- <span class="comment">     */</span>

- <span class="annotation">@SuppressWarnings</span>(<span class="string">&#8220;unchecked&#8221;</span>)

- <span class="keyword">public</span> Article getArticleWithUser(<span class="keyword">int</span> id)

- {

- Article article = <span class="keyword">null</span>;

- <span class="keyword">try</span>

- {

- article = articleDaoOpe.queryForId(id);

- helper.getDao(User.<span class="keyword">class</span>).refresh(article.getUser());

- 
- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- <span class="keyword">return</span> article;

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 通过Id得到一篇文章</span>

- <span class="comment">     * @param id</span>

- <span class="comment">     * @return</span>

- <span class="comment">     */</span>

- <span class="keyword">public</span> Article get(<span class="keyword">int</span> id)

- {

- Article article = <span class="keyword">null</span>;

- <span class="keyword">try</span>

- {

- article = articleDaoOpe.queryForId(id);

- 
- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- <span class="keyword">return</span> article;

- }

- 
- <span class="comment">/**</span>

- <span class="comment">     * 通过UserId获取所有的文章</span>

- <span class="comment">     * @param userId</span>

- <span class="comment">     * @return</span>

- <span class="comment">     */</span>

- <span class="keyword">public</span> List<Article> listByUserId(<span class="keyword">int</span> userId)

- {

- <span class="keyword">try</span>

- {

- <span class="keyword">return</span> articleDaoOpe.queryBuilder().where().eq(<span class="string">&#8220;user_id&#8221;</span>, userId)

- .query();

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- <span class="keyword">return</span> <span class="keyword">null</span>;

- }

- 
- }

接下来看我们的测试类:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_6">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> <span class="keyword">class</span> OrmLiteDbTest <span class="keyword">extends</span> AndroidTestCase

- {

- <span class="keyword">public</span> <span class="keyword">void</span> testAddArticle()

- {

- User u = <span class="keyword">new</span> User();

- u.setName(<span class="string">&#8220;张鸿洋&#8221;</span>);

- <span class="keyword">new</span> UserDao(getContext()).add(u);

- Article article = <span class="keyword">new</span> Article();

- article.setTitle(<span class="string">&#8220;ORMLite的使用&#8221;</span>);

- article.setUser(u);

- <span class="keyword">new</span> ArticleDao(getContext()).add(article);

- 
- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> testGetArticleById()

- {

- Article article = <span class="keyword">new</span> ArticleDao(getContext()).get(<span class="number">1</span>);

- L.e(article.getUser() + <span class="string">&#8221; , &#8220;</span> + article.getTitle());

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> testGetArticleWithUser()

- {

- 
- Article article = <span class="keyword">new</span> ArticleDao(getContext()).getArticleWithUser(<span class="number">1</span>);

- L.e(article.getUser() + <span class="string">&#8221; , &#8220;</span> + article.getTitle());

- }

- 
- <span class="keyword">public</span> <span class="keyword">void</span> testListArticlesByUserId()

- {

- 
- List<Article> articles = <span class="keyword">new</span> ArticleDao(getContext()).listByUserId(<span class="number">1</span>);

- L.e(articles.toString());

- }

分别测试,添加一个Article;通过Id获取一个Article;通过Id获取一个Article且携带User;通过userId获取所有的Article;

主要看第三个:通过Id获取一个Article且携带User,testGetArticleWithUser(id)

如何值传一个Article的Id,然后能够拿到Article对象,且内部的user属性直接赋值呢?

两种方式:

1、即上述写法

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_7">
    </embed>
  </div>
</div>
- article = articleDaoOpe.queryForId(id);

- helper.getDao(User.<span class="keyword">class</span>).refresh(article.getUser());

2、在user属性的注解上:@DatabaseField(canBeNull = true, foreign = true, columnName = “user_id”, foreignAutoRefresh = true)

添加foreignAutoRefresh =true,这样;当调用queryForId时,拿到Article对象则直接携带了user;

4、关联一个集合

每个User关联一个或多个Article,如果我在User中声明一个Collection

articles,我能否在查询User的时候,一并能够获取到articles的值呢?

答案是可以的。在User中添加如下属性,且注解如下:

@ForeignCollectionField
private Collection

articles;

我们在UserDao中书写查询User的代码:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_8">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> User get(<span class="keyword">int</span> id)

- {

- <span class="keyword">try</span>

- {

- <span class="keyword">return</span> userDaoOpe.queryForId(id);

- } <span class="keyword">catch</span> (SQLException e)

- {

- e.printStackTrace();

- }

- <span class="keyword">return</span> <span class="keyword">null</span> ;

- }

测试代码:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_9">
    </embed>
  </div>
</div>
- <span class="keyword">public</span> <span class="keyword">void</span> testGetUserById()

- {

- User user = <span class="keyword">new</span> UserDao(getContext()).get(<span class="number">1</span>);

- L.e(user.getName());

- <span class="keyword">if</span> (user.getArticles() != <span class="keyword">null</span>)

- <span class="keyword">for</span> (Article article : user.getArticles())

- {

- L.e(article.toString());

- }

- }

输出:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_10" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_10">
    </embed>
  </div>
</div>

可以看到,我们通过一个queryForId,成功的获取了User,以及User关联的所有的Articles;

5、条件查询QueryBuilder的使用

上述代码其实已经用到了简单的条件查询了:

1、简单的where等于

articleDaoOpe.queryBuilder().where().eq(“user_id”, userId).query();直接返回Article的列表

2、where and

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_11" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_11">
    </embed>
  </div>
</div>
- QueryBuilder<Article, Integer> queryBuilder = articleDaoOpe

- .queryBuilder();

- Where<Article, Integer> where = queryBuilder.where();

- where.eq(<span class="string">&#8220;user_id&#8221;</span>, <span class="number">1</span>);

- where.and();

- where.eq(<span class="string">&#8220;name&#8221;</span>, <span class="string">&#8220;xxx&#8221;</span>);

- 
- <span class="comment">//或者</span>

- articleDaoOpe.queryBuilder().<span class="comment">//</span>

- where().<span class="comment">//</span>

- eq(<span class="string">&#8220;user_id&#8221;</span>, <span class="number">1</span>).and().<span class="comment">//</span>

- eq(<span class="string">&#8220;name&#8221;</span>, <span class="string">&#8220;xxx&#8221;</span>);

上述两种都相当与:select * from tb_article where user_id = 1 and name = ‘xxx’ ;

3、更复杂的查询

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_12" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_12">
    </embed>
  </div>
</div>
- where.or(

- <span class="comment">//</span>

- where.and(<span class="comment">//</span>

- where.eq(<span class="string">&#8220;user_id&#8221;</span>, <span class="number">1</span>), where.eq(<span class="string">&#8220;name&#8221;</span>, <span class="string">&#8220;xxx&#8221;</span>)),

- where.and(<span class="comment">//</span>

- where.eq(<span class="string">&#8220;user_id&#8221;</span>, <span class="number">2</span>), where.eq(<span class="string">&#8220;name&#8221;</span>, <span class="string">&#8220;yyy&#8221;</span>)));

select * from tb_article where ( user_id = 1 and name = ‘xxx’ )  or ( user_id = 2 and name = ‘yyy’ )  ;

好了,再复杂的查询估计也能够凑出来了~~

6、updateBuilder、deleteBuilder

使用queryBuilder是因为我们希望执行完成查询直接返回List集合;

对于Update我们并不关注返回值,直接使用

articleDaoOpe.updateRaw(statement, arguments);传入sql和参数即可~~

何必在那articleDaoOpe.updateBuilder().updateColumnValue(“name”,”zzz”).where().eq(“user_id”, 1);这样的痛苦呢~~~

同理还有deleteBuilder还是建议直接拼写sql,当然很简单的除外,直接使用它的API~

7、事务操作

在我们的Dao中直接写如下代码:

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_13" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_13">
    </embed>
  </div>
</div>
- <span class="comment">//事务操作</span>

- TransactionManager.callInTransaction(helper.getConnectionSource(),

- <span class="keyword">new</span> Callable<Void>()

- {

- 
- <span class="annotation">@Override</span>

- <span class="keyword">public</span> Void call() <span class="keyword">throws</span> Exception

- {

- <span class="keyword">return</span> <span class="keyword">null</span>;

- }

- });

 

8、其他操作

1、当Bean继承BaseDaoEnabled时,可以使用bean.create(bean);bean.update(bean)一类操作

例如:

Student extends BaseDaoEnabled<Student, Integer>

Dao dao = DatabaseHelper.getHelper(getContext()).getDao(Student.class);
Student student = new Student();
student.setDao(dao);
student.setName(“张鸿洋”);
student.create();

前提dao需要手动设置,如果dao为null会报错,尼玛,我觉得一点用没有。。。

2、Join

**[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/39122981#)[copy](http://blog.csdn.net/lmj623565791/article/details/39122981#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/465469)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/465469/fork)
  <div>
    <embed id="ZeroClipboardMovie_14" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_14">
    </embed>
  </div>
</div>
- QueryBuilder<Article, Integer> articleBuilder = articleDaoOpe

- .queryBuilder();

- QueryBuilder userBuilder = helper.getDao(User.<span class="keyword">class</span>).queryBuilder();

- articleBuilder.join(userBuilder);

Article与User做Join操作;

本篇主要想介绍在项目中如何写DataBaseHelper已经如何写BeanDao,以及列出了在项目中可能会用到的ORMLite的功能,如果需要详细了解,还请看ORMLite官方文档,源码中也会提供~~

源码点击下载

 

 

💬 评论