什麼是ORMLite:
ormlite,是針對數據庫中的表進行操作的一個第三方,他的作用非常的簡單,就是通過映射的方式將類中的一個實體類對象中的屬性和數據庫中的表形成映射,通過映射,也就是說通過對對象(屬性)進行操作來達到對數據庫中的表內容進行操作。
實現步驟:
1,導入相應的jar包;
一共兩個包:一個是ormlite-core-4.24.jar,另一個是ormlite-android-4.24.jar
從以下網址可以下載到: http://ormlite.com/releases/
2,創建一個幫助類繼承自OrmLiteSqliteOpenHelper,這一步和基本的sql使用方式差不多
通過兩個方法核心方法達到創建和刪除數據庫
TableUtils.dropTable(connectionSource,"實體類名",true);
TableUtils.createTable(connectionSource,"實體類名");
個人習慣在helper中創建單例和寫明創建實體對象(我們稱作Dao對象)的方法,然後在外界直接調用,這個因人而異。
數據類型爲:Dao<Student,Long>
3,創建實體類,在實體類中通過映射將實體類和數據庫中的表進行綁定關聯,
4,最後異步,在main中開始得到實體類對象,之後對實體類對象進操作即可。
基本的思路說完了,來通過代碼進行更加深入的瞭解吧,這裏添加依賴着這種就沒必要貼代碼了
創建幫助類:
/**
* 數據庫訪問的幫助類
*/
public class MySqliteOpenHelper extends OrmLiteSqliteOpenHelper{
private static final String DB_NAME="db_student";//數據庫的名稱
private static final int DB_VERSON=1;//數據庫的版本
private static MySqliteOpenHelper helper;
private Dao<Student,Long> studentDao;//針對student數據表操作的具體對象
/**
* 採用單例模式構建數據庫幫助類對象 保證app中存在一個helper對象
*/
public static MySqliteOpenHelper getInstance(Context context){
if(helper==null){
helper=new MySqliteOpenHelper(context);
}
return helper;
}
/**
* 針對每個bean類創建xxDao對象處理當前的bean對應的數據表的操作
*/
public Dao<Student,Long> getStudentDao() throws SQLException {
if(studentDao==null){
studentDao=getDao(Student.class);
}
return studentDao;
}
//必須定義的構造函數
public MySqliteOpenHelper(Context context, String databaseName,
SQLiteDatabase.CursorFactory factory, int databaseVersion) {
super(context, databaseName, factory, databaseVersion);
}
//這是初始化的時候默認的數據庫名字和版本號,這裏爲了簡便直接生成,也可以在創建對象的時候生成
public MySqliteOpenHelper(Context context){
super(context,DB_NAME,null,DB_VERSON);
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
//創建數據表createTable(連接對象,需要創建表的實體類字節碼對象)
TableUtils.createTable(connectionSource,Student.class);
// TableUtils.createTable(connectionSource,xxx.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
if(newVersion>oldVersion){
//具體的數據庫更新的代碼
try {
//dropTable(,,標示是否忽略異常)
TableUtils.dropTable(connectionSource,Student.class,true);
TableUtils.createTable(connectionSource,Student.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
接下下來看看實體類是如何和數據庫進行關聯的吧/**
* java Student類--數據庫中的student表
這裏很簡單,就是簡單的創建了一個學生實體類,聲明瞭幾個屬性,和set,get方法,但是注意,看看是不是多了些東西呢?
*/
//DatabaseTable 標示數據庫中的一張表 tableName指定表明
@DatabaseTable(tableName = "student")//此處的註解是用來說明,這個實體類和數據庫進行了關聯,
public class Student {
//DatabaseField 標明數據庫中的字段名(列名) generatedId=true 組建自動增長
@DatabaseField(columnName = "_id",generatedId = true)//只要屬性的上邊有註解,就說明這個屬性將來在操作的時候就會成爲數據庫表中的一個操作列,也可以說一項。
private long _id;
@DatabaseField(columnName = "age",dataType = DataType.INTEGER)
private int age;
@DatabaseField(columnName = "name",dataType = DataType.STRING)
private String name;
@DatabaseField(columnName = "sex",dataType = DataType.STRING)
private String sex;
public Student(int age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
public Student(){
}
public long get_id() {
return _id;
}
public void set_id(long _id) {
this._id = _id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
最後就是在活動中進行操作了,在這裏通過先創建helper對象,通過此對象調用單例得到dao對象,開始通過按鈕邏輯,對dao對象進行操作,思路看下邊代碼:
/**
* ORM 實現面向對象編程語言中不同類型的系統數據轉換
*
* ORM Object-Relational Mapping 對象關係映射
* Java中對象與數據庫表中的紀錄進行映射
* 實體類持久化到數據庫中 數據庫中表的查詢紀錄映射成java對象
*
* 數據庫中的表映射成java中的類
* 數據庫表中的數據映射成java中的對象
*
* 數據庫的訪問框架 orm 利用反射機制將對象和數據庫表中的紀錄產生映射關係
* 例如:插入 對象中的屬性值映射成數據表中的字段值進行插入
*
* OrmLite 加載連接數據庫的第三方框架
* 1.下載OrmLite相應的jar
* 2.配置bean類
* 3.編寫數據庫幫助類 ormLiteSqliteOpenHelper--對SqliteOpenHelper的封裝
* 4.執行crud操作
*/
public class MainActivity extends AppCompatActivity {
private ListView lv;
private MySqliteOpenHelper helper;
private Dao<Student,Long> studentDao;
private List<Student> list=new ArrayList<>();
private MyBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initHelper();
initView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
//刷新數據的方法
public void refreshData(List<Student> result){
list.clear();
list.addAll(result);
adapter.notifyDataSetChanged();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_insert://插入數據
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("添加數據");
View view= LayoutInflater.from(this).inflate(R.layout.dialog_view,null);
builder.setView(view);
final EditText et_name= (EditText) view.findViewById(R.id.et_name);
final EditText et_sex= (EditText) view.findViewById(R.id.et_sex);
final EditText et_age= (EditText) view.findViewById(R.id.et_age);
builder.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//動態的獲取姓名 性別 年齡
String name=et_name.getText().toString().trim();
String sex=et_sex.getText().toString().trim();
String age=et_age.getText().toString().trim();
if(!TextUtils.isEmpty(name) && !TextUtils.isEmpty(sex)
&& !TextUtils.isEmpty(age)){
int intAge=Integer.parseInt(age);
Student student=new Student(intAge,sex,name);
try {
//存儲數據 插入數據
int count=studentDao.create(student);
if(count>0){
Log.i("tag","添加成功!");
//刷新界面的函數
refreshData(selectAll());
}else{
Log.i("tag","添加失敗!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
});
builder.setNegativeButton("取消",null);
builder.create().show();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* 查詢數據庫表中的所有的數據
* @return 集合
*/
public List<Student> selectAll(){
try {
//select * from student where age=18 or sex='男' order by _id desc;
// studentDao.queryBuilder().orderBy("_id",false)
// .where().eq("age",18).or().eq("sex","男").query();
//queryForAll()查詢所有
return studentDao.queryForAll();//select * from student;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 初始化view視圖
*/
public void initView(){
lv= (ListView) findViewById(R.id.lv);
list=selectAll();
adapter=new MyBaseAdapter(list,this);
lv.setAdapter(adapter);
}
/**
* 初始化數據庫連接
*/
public void initHelper(){
helper=MySqliteOpenHelper.getInstance(this);
try {
// studentDao=helper.getStudentDao();
studentDao=helper.getDao(Student.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
}