編輯:關於Android編程
vc/Hv7TztcSjrLK7ysfO0sPHyP3R1MG90+++zcTcveK+9rXEo6zO0tK71rHP67PpuPbKsbzk19S8utTZuf3Su7HpU3FsaXRlus1KREJDtcSjrLWrysejrLTzvNLSstaqtcCjrMv2ysKxyL3PtuCjrM7Sw8fAtMu10rvPwsr9vt2/4rXEv/K83LDJo6zKwsq1yc/K0MPmyc+jrM7SvvW1w7u5v8nS1LXEyv2+3b/iv/K83NPQwb249qOsT1JNTGl0ZbrNR3JlZW5EYW+jrM7S0tTHsNf2tcTUy7avwOC1xNOm08PJz6Osvs3Q6NKqtOa0orTzwb+1xNTLtq/K/b7do6zO0sPH1+6/qsq8ysfU2rG+tdjQtMr9vt2/4rXEo6zEx9KyysexyL3PwM+1xMLfvK3By6OsuvPAtM7Sw8fXvLG41ti5uc/uxL+1xMqxuvKjrM7Svva2qLDRyv2+3b/i0rLW2Lm50rvPwqOs0vLOqs7Sw8e1scqxtcTTptPDtsHIocvZtsjAtLu5ysexyL3Pwv21xKOsscjI58Tj09DSu8G9xOq1xMr9vt3WrsDgtcSjrM7SuvPAtL7N0dC+v8HL0rvPwtXiwb249r/yvNyjrMvkyLvO0tfuuvOyydPDtcTKx0dyZWVuRGFvo6y1q8rHT1JNTGl0ZdKyysfR0L6/wcvSu7vhtvmjrMv50tSjrL3Tz8LAtKOsztK9q7DR1eLBvbj2v/K83LfWwb3Gqs7E1cLAtLfWzvajrMrXz8i+zcrHT1JNTGl0ZcHLLM34yc+7ucrH09C63LbgudjT2sv7w8e1xM7E1cK1xKOsy/nS1M7S0rLKx9e8sbjVvtTavt7Iy7XEvOew8snPo6zK18/Iy/vDx9auvOS1xNPFyLG146Os0rLT0MewsbLQtMHLo6zE47/J0tSyzr+80rvPwjwvcD4NCjwvYmxvY2txdW90ZT4NCjxhIGhyZWY9"http://blog.csdn.net/xushuaic/article/details/24434881">SQLite數據庫框架ORMLite與GreenDao的簡單比較
Android ORMLite 框架的入門用法 Android 快速開發系列 ORMLite 框架最佳實踐而且鴻洋老師也寫了兩篇關於ORMLite的文章
但是就算他們寫了,我覺得我再根據自己的邏輯去講一遍,很多人還是會收益的,我自信我的文筆應該還是算不錯的,而且我是基於Android studio來講的。嘻嘻,話不多說,我們來新建一個項目:
官網:http://ormlite.com/ jar下載:http://ormlite.com/releases/在以前,我們寫數據庫時怎麼寫的?那就是頻繁的去寫SQLiteOpenHelper了,所以後來在我們開發中,很多人就喜歡封裝他們,提高性能,也就出現了很多的數據庫框架,ORMLite算是一個佼佼者了
http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_1.html#Getting-Started我們根據官方文檔來看這個框架是怎麼樣集成的,官網上有共有四個步驟
知道他需要兩個jar,一個android的,一個core的可以直接去下載
然後添加到libs目錄下,然後右鍵——Add As Library就算是添加成功了,緊接著,我們在xml中寫個按鈕用來創建表和保存數據
OK,我們繼續看文檔,他需要編寫一個bean類來聲明一些表明和字段的
既然如此,那我們就創建好了,這個類可不簡單,它主要通過注解去注明表單信息,然後映射給整個數據庫,我們看
package com.lgl.ormlite;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* bean類,對應的整個數據庫的表單信息,幫助我們映射到整個數據庫當中
* Created by LGL on 2016/6/26.
*/
//配置表名
@DatabaseTable(tableName = "user_info")
public class User {
//配置主鍵 id
@DatabaseField(generatedId = true)
private int id;
//名稱
@DatabaseField(columnName = "name")
private String name;
//描述
@DatabaseField(columnName = "desc")
private String desc;
//空構造
public User(){
}
//構造方法
public User(int id, String name, String desc) {
this.id = id;
this.name = name;
this.desc = desc;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
寫起來還是邏輯性很強的,如果需要一些特別的參數的話,可以參考一下官網上的項目描述,首先在User類上添加@DatabaseTable(tableName = “user_info”),標明這是數據庫中的一張表名字為user_info,然後分別在屬性上添加@DatabaseField(columnName = “name”) ,columnName的值為該字段在數據中的列名,@DatabaseField(generatedId = true) ,generatedId 表示id為主鍵且自動生成,好了,到這裡,我們繼續看官方的文檔了
官網寫的很詳細呀,我們跟著造輪子既可呀,嘿嘿,那我們就來寫這個Dao類吧,注意,注釋寫的很清楚了哦!
package com.lgl.ormlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* Dao類
* Created by LGL on 2016/6/26.
*/
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {
//創建數據庫名稱
private static final String DATABASE_NAME = "ormlite_sql.db";
//版本號
private static final int DATABASE_VERSION = 1;
//存放Dao
private Map maps = new HashMap<>();
//單例模式
private static DataBaseHelper instance;
public static synchronized DataBaseHelper getInstance(Context context) {
if (instance == null) {
synchronized (DataBaseHelper.class) {
if (instance == null) {
instance = new DataBaseHelper(context);
}
}
}
return instance;
}
/**
* 獲得數據庫的訪問對象
*
* @param cls
* @return
* @throws SQLException
*/
public synchronized Dao getDao(Class cls) throws SQLException {
Dao dao = null;
//通過反射獲得類的名稱
String clsName = cls.getSimpleName();
//是否存在該對象
if (maps.containsKey(clsName)) {
dao = maps.get(clsName);
} else {
dao = super.getDao(cls);
maps.put(clsName, dao);
}
return dao;
}
/**
* 關閉所有操作
*/
public void close() {
super.close();
//獲取所有的map鍵值對置空
for (String key : maps.keySet()) {
Dao dao = maps.get(key);
dao = null;
}
}
//構造方法
public DataBaseHelper(Context context) {
//上下文,數據庫名,null,版本號
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//創建數據庫
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
try {
//對數據庫的創建以及表的建立
TableUtils.clearTable(connectionSource, User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
//更新數據庫
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
try {
//調用更新就刪除數據庫
TableUtils.dropTable(connectionSource, User.class, true);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
到這裡,我們的前期都OK了,緊接著,我們就可以去操作這些數據了
這個類主要是對數據的初始化和操作的
package com.lgl.ormlite;
import android.content.Context;
import com.j256.ormlite.dao.Dao;
import java.sql.SQLException;
/**
* 數據庫操作類
* Created by LGL on 2016/6/26.
*/
public class UserDao {
//上下文
private Context mContext;
//主鍵查詢
private DaouserDao;
//Dao類
private DataBaseHelper helper;
public UserDao(Context mContext) {
this.mContext = mContext;
//創建數據庫
helper = DataBaseHelper.getInstance(mContext);
try {
//操作Dao
userDao = helper.getDao(User.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void addUser(User user){
try {
userDao.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
OK,基本上現在可以去實際的操作了,這個UserDao類我們等下還需要去完善,現在先這樣,我們去實現按鈕的點擊事件
//點擊事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_create_save:
userDao = new UserDao(this);
User user = new User();
user.setName("lgl");
user.setDesc("Android");
userDao.addUser(user);
break;
}
}
到這裡,我們就可以去操作了,我們去看數據庫,打開DDMS
當然,你也可以打開看看
既然插入成功了,那我們嘗試一下多條語句的插入吧
case R.id.btn_create_save:
User user = new User();
user.setName("lgl");
user.setDesc("Android");
userDao.addUser(user);
User user1 = new User();
user.setName("zhangsan");
user.setDesc("IOS");
userDao.addUser(user1);
User user2 = new User();
user.setName("lisi");
user.setDesc("python");
userDao.addUser(user2);
break;
OK,運行一下
我們繼續操作UserDao這個類
//更新User
public void updateUser(User user) {
try {
userDao.update(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
既然可以更新,那我們寫個按鈕
寫完之後,我們就可以執行了
case R.id.btn_update:
//我們可以修改id為1的這個數據
User user3 = new User();
user3.setId(1);
user3.setName("lgl帥哥");
userDao.updateUser(user3);
break;
我們可以看下結果
OK,這就是我們的改了,我們可以封裝一下
/**
* 根據ID來更新
* @param user
* @param id
*/
public void updateById(User user,Integer id){
try {
userDao.updateId(user,id);
} catch (SQLException e) {
e.printStackTrace();
}
}
還有一個修改方法
/**
* 修改數據,支持多條
*
* @param user
*/
public void updateUserByBuilder(User user) {
try {
UpdateBuilder builder = userDao.updateBuilder();
builder.updateColumnValue("name", user.getName()).where().eq("id", 1);
builder.update();
} catch (SQLException e) {
e.printStackTrace();
}
}
刪除我們可以根據條件刪除,就直接貼代碼了
/**
* 刪除
*
* @param user
*/
public void deleteUser(User user) {
//刪除的方法比較多,根據的條件也比較多
try {
userDao.delete(user);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 多個對象的刪除操作
*
* @param users
*/
public void deleteMulUser(List users) {
try {
userDao.delete(users);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 根據ID刪除
*
* @param ids
*/
public void deleteUserById(List ids) {
try {
userDao.deleteIds(ids);
} catch (SQLException e) {
e.printStackTrace();
}
}
你要刪除直接調用就好了
查算是比較多的場景了,我們也可以多條件查詢,看我們全部查詢的例子
/**
* 全部查詢
*
* @return
*/
public List listAll() {
try {
return userDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
但是我們一般也不會用到全部查詢,條件查詢才是必須的,所以我們再新建一個按鈕
OK.我們就可以查詢了,我們寫個單表查詢
/**
* 查詢單張表
*
* @return
*/
public List queryBuilder() {
List list = null;
//查詢器
QueryBuilder queryBuilder = userDao.queryBuilder();
//聲明where條件
Where where = queryBuilder.where();
//查詢sesc字段的name是哪個值
try {
where.eq("name", "lgl");
where.and();
where.eq("desc", "Android");
where.prepare();
list = queryBuilder.query();
//select * from user_info where name = 'lgl' and desc = 'Android'
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
注意在點擊事件裡
case R.id.btn_query:
List list = userDao.queryBuilder();
Log.i(TAG, list.toString());
break;
好的,我們現在看Log
我們多條件查詢
/**
* 多條件查詢
*
* @return
*/
public List queryBuilders() {
List list = null;
QueryBuilder queryBuilder = userDao.queryBuilder();
Where where = queryBuilder.where();
try {
where.or(where.and(where.eq("", ""), where.eq("", "")), where.and(where.eq("", ""), where.ge("", ""))).query();
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
這裡我們就不演示了
最後,只能說,ORMLite是比較強大的,我們如果真的要去理解他的話,還是得去看他的API文檔,不然真的無從下手,我這篇博文也只是希望大家能對ORMLite有個大概的了解,不敢妄自說精通,好的,本篇博客到這裡也就結束了,如果大家覺得還不錯的話,不妨點個贊!
// ActivityA中注冊廣播接收器 class ActivityA extends Activity { @Override
谷歌官方提供了apktool可以逆向已經發布出去的APK應用,即反編譯已經打包成功的APK文件,使用它可以將其反編譯成非常接近打包前的原始格式,對於APK來說,可以具體的
先上圖: 這裡要實現的是,點擊上面的按鈕後,將TextView隨機移動到底部按鈕的位置 首先,將底部按鈕放入list中,方便後
1. 開發環境Mac OS X , Android Studio 2.1.2 2. 創建新工程創建SerialPortDemo工程, Minimum SDK 選