Realm資料庫使用教程(二):增加資料
阿新 • • 發佈:2019-01-25
Realm配置已經完成那麼就應該增刪改查等操作,如上圖功能,在這裡考慮循序漸進,就從“增加->查->改->刪->資料遷移->問題”的功能程序介紹
增加資料
同步操作
- 同步操作:使用executeTransaction方法插入資料
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student = realm.createObject(Student.class);
student.setName("使用executeTransaction方法插入資料" );
student.setNum(new Random().nextInt(20));
}
});
- 同步操作:使用copyToRealmOrUpdate方法插入資料
/**
* 當Model中存在主鍵的時候,推薦使用copyToRealmOrUpdate方法插入資料。
* 如果物件存在,就更新該物件;反之,它會建立一個新的物件。
*/
final User user = new User();
user.setId(2);
user.setName("使用copyToRealmOrUpdate方法插入資料");
user.setAge(new Random().nextInt(20));
user.setSex("同步");
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(user);
}
});
- 同步操作:使用copyToRealm方法插入資料
/**
*若該Model沒有主鍵,使用copyToRealm方法,否則將丟擲異常。
*/
final Student student = new Student();
student.setName("使用copyToRealm方法插入資料");
student.setNum(new Random().nextInt(20));
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(student);
}
});
- 同步操作:增加一對一表,Person包含Men(以executeTransaction為例)
Person類與Men 類,文章最下方有提供!
//以executeTransaction為例
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Person person = realm.createObject(Person.class);
person.setCity("杭州");
person.setProject("android");
Men men = realm.createObject(Men.class);
men.setName("huangxiaoguo");
men.setAge(25);
person.setMen(men);
}
});
- 同步操作:增加一對一表,Person包含一個Men(以copyToRealm為例)
final Person person1 = new Person();
person1.setCity("杭州");
person1.setProject("android");
Men men1 = new Men();
men1.setName("huangxiaoguo");
men1.setAge(new Random().nextInt(100));
person1.setMen(men1);
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//如果使用copyToRealmOrUpdate,Person需要主鍵
realm.copyToRealm(person1);
}
});
- 同步操作:增加一對多表,Person包含多個Men(以executeTransaction為例)
MorePerson類在文章最下方提供
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
MorePerson morePerson = realm.createObject(MorePerson.class);
morePerson.setCity("杭州");
morePerson.setProject("開發工程師");
morePerson.setTime(simpleDateFormat.format(new Date()));
for (int i = 0; i < 3; i++) {
Men men = realm.createObject(Men.class);
men.setName("huangxiaoguo" + i);
men.setAge(new Random().nextInt(100));
morePerson.getMens().add(men);
}
}
});
注意:在Realm中不能使用android原有的list集合,需要Realm特定的RealmList集合!
- 同步操作:增加一對多表,Person包含多個Men(以copyToRealm為例)
final MorePerson morePerson1 = new MorePerson();
morePerson1.setCity("杭州");
morePerson1.setProject("開發工程師");
morePerson1.setTime(simpleDateFormat.format(new Date()));
RealmList<Men> menList = new RealmList<>();
for (int i = 0; i < 3; i++) {
Men men2 = new Men();
men2.setName("huangxiaoguo" + i);
men2.setAge(new Random().nextInt(100));
menList.add(men2);
}
morePerson1.setMens(menList);
for (int i = 0; i < 3; i++) {
Men men2 = new Men();
men2.setName("huangxiaoguo" + i);
men2.setAge(new Random().nextInt(100));
morePerson1.getMens().add(men2);
}
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(morePerson1);
}
});
- 同步操作:beginTransaction和commitTransaction方法插入資料(不建議使用)
//注意:在UI和後臺執行緒同時開啟建立write的事務,可能會導致ANR錯誤。
// 為了避免該問題,可以使用executeTransactionAsync來實現。
mRealm.beginTransaction();//開啟事務
Student student1 = mRealm.createObject(Student.class);
student1.setName("事務方式插入資料");
student1.setNum(new Random().nextInt(100) + 100);
mRealm.commitTransaction();
非同步操作(建議使用)
- 非同步操作:使用executeTransactionAsync直接插入資料
//該方法會開啟一個子執行緒來執行事務,並且在執行完成後進行結果通知。
realmAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student2 = realm.createObject(Student.class);
student2.setName("使用executeTransactionAsync直接插入資料");
student2.setNum(new Random().nextInt(100) + 200);
}
});
非同步操作需要在activity不可見或關閉時取消任務
@Override
protected void onDestroy() {
super.onDestroy();
if (realmAsyncTask != null && !realmAsyncTask.isCancelled()) {
realmAsyncTask.cancel();
}
if (mRealm != null && !mRealm.isClosed()) {
mRealm.close();
}
}
- 非同步操作:使用executeTransactionAsync並且進行監聽
//注意:如果當Acitivity或Fragment被銷燬時,在OnSuccess或OnError中執行UI操作,
// 將導致程式奔潰 。用RealmAsyncTask .cancel();可以取消事務
//在onStop或onDestroy中呼叫,避免crash
realmAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student2 = realm.createObject(Student.class);
student2.setName("使用executeTransactionAsync監聽");
student2.setNum(new Random().nextInt(100) + 300);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
UIUtils.showToast("新增成功");
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
UIUtils.showToast("新增失敗");
}
});
將Json字串轉化為物件
- 將Json字串轉化為物件(使用Json字串插入資料)
模擬網路資料
{
"reason": "SUCCESSED!",
"result": [
{
"dapandata": {},
"data": {
"buyFive": "113700",
"buyFivePri": "8.42",
"buyFour": "87200",
"buyThreePri": "8.35",
"buyTwoPri": "8.36",
"competitivePri": "8.37",
"date": "2012-12-11",
"gid": "sh601009",
"increase": "43.99",
"name": "南京銀行",
"nowPri": "8.37",
"reservePri": "8.38",
"sellFive": "214535",
"time": "15:03:06",
"todayMax": "8.55",
"traAmount": "290889560",
"traNumber": "34501453",
"yestodEndPri": "8.26"
},
"gopicture": {
"dayurl": "http://image.sinajs.cn/newchart/daily/n/sh601009.gif",
"minurl": "http://image.sinajs.cn/newchart/min/n/sh601009.gif",
"monthurl": "http://image.sinajs.cn/newchart/monthly/n/sh601009.gif",
"weekurl": "http://image.sinajs.cn/newchart/weekly/n/sh601009.gif"
}
}
],
"resultcode": "200"
}
建立資料庫Model
package tsou.com.simple.realmtest.bean;
import io.realm.RealmObject;
/**
* Created by Administrator on 2017/12/18 0018.
* Realm 解析 JSON 時遵循如下規則:
* <p>
* 使用包含空值(null)的 JSON 建立物件:
* 對於非必須(可為空值的屬性),設定其值為 null;
* 對於必須(不可為空值的屬性),丟擲異常;
* 使用包含空值(null)的 JSON 更新物件:
* 對於非必須(可為空值的屬性),設定其值為 null;
* 對於必須(不可為空值的屬性),丟擲異常;
* 使用不包含對應屬性的 JSON: * 該屬性保持不變
* <p>
*/
public class Stock extends RealmObject {
/**
* buyFive : 113700
* buyFivePri : 8.42
* buyFour : 87200
* buyThreePri : 8.35
* buyTwoPri : 8.36
* competitivePri : 8.37
* date : 2012-12-11
* gid : sh601009
* increase : 43.99
* name : 南京銀行
* nowPri : 8.37
* reservePri : 8.38
* sellFive : 214535
* time : 15:03:06
* todayMax : 8.55
* traAmount : 290889560
* traNumber : 34501453
* yestodEndPri : 8.26
*/
private String buyFive;
private String buyFivePri;
private String buyFour;
private String buyThreePri;
private String buyTwoPri;
private String competitivePri;
private String date;
private String gid;
private String increase;
private String name;
private String nowPri;
private String reservePri;
private String sellFive;
private String time;
private String todayMax;
private String traAmount;
private String traNumber;
private String yestodEndPri;
public String getBuyFive() {
return buyFive;
}
public void setBuyFive(String buyFive) {
this.buyFive = buyFive;
}
public String getBuyFivePri() {
return buyFivePri;
}
public void setBuyFivePri(String buyFivePri) {
this.buyFivePri = buyFivePri;
}
public String getBuyFour() {
return buyFour;
}
public void setBuyFour(String buyFour) {
this.buyFour = buyFour;
}
public String getBuyThreePri() {
return buyThreePri;
}
public void setBuyThreePri(String buyThreePri) {
this.buyThreePri = buyThreePri;
}
public String getBuyTwoPri() {
return buyTwoPri;
}
public void setBuyTwoPri(String buyTwoPri) {
this.buyTwoPri = buyTwoPri;
}
public String getCompetitivePri() {
return competitivePri;
}
public void setCompetitivePri(String competitivePri) {
this.competitivePri = competitivePri;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getGid() {
return gid;
}
public void setGid(String gid) {
this.gid = gid;
}
public String getIncrease() {
return increase;
}
public void setIncrease(String increase) {
this.increase = increase;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNowPri() {
return nowPri;
}
public void setNowPri(String nowPri) {
this.nowPri = nowPri;
}
public String getReservePri() {
return reservePri;
}
public void setReservePri(String reservePri) {
this.reservePri = reservePri;
}
public String getSellFive() {
return sellFive;
}
public void setSellFive(String sellFive) {
this.sellFive = sellFive;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getTodayMax() {
return todayMax;
}
public void setTodayMax(String todayMax) {
this.todayMax = todayMax;
}
public String getTraAmount() {
return traAmount;
}
public void setTraAmount(String traAmount) {
this.traAmount = traAmount;
}
public String getTraNumber() {
return traNumber;
}
public void setTraNumber(String traNumber) {
this.traNumber = traNumber;
}
public String getYestodEndPri() {
return yestodEndPri;
}
public void setYestodEndPri(String yestodEndPri) {
this.yestodEndPri = yestodEndPri;
}
}
解析並插入資料庫
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
String stockJson = UIUtils.getJson("Stock");
try {
JSONObject js = new JSONObject(stockJson);
String result = js.optString("result");
JSONArray jsonArray = new JSONArray(result);
String resultOne = jsonArray.optString(0);
JSONObject js2 = new JSONObject(resultOne);
String data = js2.optString("data");
realm.createObjectFromJson(Stock.class, data);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
好了,到這裡增添資料的方法基本上都介紹完了,如果資料多的話建議使用非同步!其他功能請看下文!
這裡提供整個activity程式碼以供參考:
package tsou.com.simple.realmtest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import io.realm.Realm;
import io.realm.RealmAsyncTask;
import io.realm.RealmList;
import tsou.com.simple.realmtest.adapter.MyAdapter;
import tsou.com.simple.realmtest.bean.Men;
import tsou.com.simple.realmtest.bean.MorePerson;
import tsou.com.simple.realmtest.bean.Person;
import tsou.com.simple.realmtest.bean.Stock;
import tsou.com.simple.realmtest.bean.Student;
import tsou.com.simple.realmtest.bean.User;
import tsou.com.simple.realmtest.utils.UIUtils;
public class AddActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
private ListView mListview;
private List<String> titles = new ArrayList<>();
private Realm mRealm;
private SimpleDateFormat simpleDateFormat;
private RealmAsyncTask realmAsyncTask;
@Override
protected void onDestroy() {
super.onDestroy();
if (realmAsyncTask != null && !realmAsyncTask.isCancelled()) {
realmAsyncTask.cancel();
}
if (mRealm != null && !mRealm.isClosed()) {
mRealm.close();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
mRealm = UIUtils.getRealmInstance();
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
initData();
initView();
initListener();
}
private void initData() {
//***********************同步操作*********************************
//注意:如果在UI執行緒中插入過多的資料,可能會導致主執行緒擁塞。
titles.add("同步操作:使用executeTransaction方法插入資料");
titles.add("同步操作:使用copyToRealmOrUpdate方法插入資料");
titles.add("同步操作:使用copyToRealm方法插入資料");
titles.add("同步操作:增加一對一表,Person包含Men(以executeTransaction為例)");
titles.add("同步操作:增加一對一表,Person包含一個Men(以copyToRealm為例)");
titles.add("同步操作:增加一對多表,Person包含多個Men(以executeTransaction為例)");
titles.add("同步操作:增加一對多表,Person包含多個Men(以copyToRealm為例)");
titles.add("同步操作:beginTransaction和commitTransaction方法插入資料");
//***********************非同步操作*********************************
titles.add("非同步操作:使用executeTransactionAsync直接插入資料");
titles.add("非同步操作:使用executeTransactionAsync並且進行監聽");
//***********************將Json字串轉化為物件*****************
titles.add("將Json字串轉化為物件(使用Json字串插入資料)");
}
private void initView() {
mListview = (ListView) findViewById(R.id.listview);
mListview.setAdapter(new MyAdapter(this, titles));
}
private void initListener() {
mListview.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
switch (position) {
default:
break;
case 0://同步操作:使用executeTransaction方法插入資料
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student = realm.createObject(Student.class);
student.setName("使用executeTransaction方法插入資料");
student.setNum(new Random().nextInt(20));
}
});
break;
case 1://同步操作:使用copyToRealmOrUpdate方法插入資料
/**
* 當Model中存在主鍵的時候,推薦使用copyToRealmOrUpdate方法插入資料。
* 如果物件存在,就更新該物件;反之,它會建立一個新的物件。
*/
final User user = new User();
user.setId(2);
user.setName("使用copyToRealmOrUpdate方法插入資料");
user.setAge(new Random().nextInt(20));
user.setSex("同步");
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(user);
}
});
break;
case 2://同步操作:使用copyToRealm方法插入資料
/**
*若該Model沒有主鍵,使用copyToRealm方法,否則將丟擲異常。
*/
final Student student = new Student();
student.setName("使用copyToRealm方法插入資料");
student.setNum(new Random().nextInt(20));
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(student);
}
});
break;
case 3://同步操作:增加一對一表,Person包含Men(以executeTransaction為例)
//以executeTransaction為例
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Person person = realm.createObject(Person.class);
person.setCity("杭州");
person.setProject("android");
Men men = realm.createObject(Men.class);
men.setName("huangxiaoguo");
men.setAge(25);
person.setMen(men);
}
});
break;
case 4://同步操作:增加一對一表,Person包含Men(以copyToRealm為例)
final Person person1 = new Person();
person1.setCity("杭州");
person1.setProject("android");
Men men1 = new Men();
men1.setName("huangxiaoguo");
men1.setAge(new Random().nextInt(100));
person1.setMen(men1);
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
//如果使用copyToRealmOrUpdate,Person需要主鍵
realm.copyToRealm(person1);
}
});
break;
case 5://同步操作:增加一對多表,Person包含多個Men(以executeTransaction為例)
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
MorePerson morePerson = realm.createObject(MorePerson.class);
morePerson.setCity("杭州");
morePerson.setProject("開發工程師");
morePerson.setTime(simpleDateFormat.format(new Date()));
for (int i = 0; i < 3; i++) {
Men men = realm.createObject(Men.class);
men.setName("huangxiaoguo" + i);
men.setAge(new Random().nextInt(100));
morePerson.getMens().add(men);
}
}
});
break;
case 6://同步操作:增加一對多表,Person包含多個Men(以copyToRealm為例)
final MorePerson morePerson1 = new MorePerson();
morePerson1.setCity("杭州");
morePerson1.setProject("開發工程師");
morePerson1.setTime(simpleDateFormat.format(new Date()));
RealmList<Men> menList = new RealmList<>();
for (int i = 0; i < 3; i++) {
Men men2 = new Men();
men2.setName("huangxiaoguo" + i);
men2.setAge(new Random().nextInt(100));
menList.add(men2);
}
morePerson1.setMens(menList);
for (int i = 0; i < 3; i++) {
Men men2 = new Men();
men2.setName("huangxiaoguo" + i);
men2.setAge(new Random().nextInt(100));
morePerson1.getMens().add(men2);
}
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealm(morePerson1);
}
});
break;
case 7://同步操作:beginTransaction和commitTransaction方法插入資料
//注意:在UI和後臺執行緒同時開啟建立write的事務,可能會導致ANR錯誤。
// 為了避免該問題,可以使用executeTransactionAsync來實現。
mRealm.beginTransaction();//開啟事務
Student student1 = mRealm.createObject(Student.class);
student1.setName("事務方式插入資料");
student1.setNum(new Random().nextInt(100) + 100);
mRealm.commitTransaction();
break;
case 8://非同步操作:使用executeTransactionAsync直接插入資料
//該方法會開啟一個子執行緒來執行事務,並且在執行完成後進行結果通知。
realmAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student2 = realm.createObject(Student.class);
student2.setName("使用executeTransactionAsync直接插入資料");
student2.setNum(new Random().nextInt(100) + 200);
}
});
break;
case 9://非同步操作:使用executeTransactionAsync並且進行監聽
//注意:如果當Acitivity或Fragment被銷燬時,在OnSuccess或OnError中執行UI操作,
// 將導致程式奔潰 。用RealmAsyncTask .cancel();可以取消事務
//在onStop或onDestroy中呼叫,避免crash
realmAsyncTask = mRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Student student2 = realm.createObject(Student.class);
student2.setName("使用executeTransactionAsync監聽");
student2.setNum(new Random().nextInt(100) + 300);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
UIUtils.showToast("新增成功");
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
UIUtils.showToast("新增失敗");
}
});
break;
case 10://將Json字串轉化為物件(使用Json字串插入資料)
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
String stockJson = UIUtils.getJson("Stock");
try {
JSONObject js = new JSONObject(stockJson);
String result = js.optString("result");
JSONArray jsonArray = new JSONArray(result);
String resultOne = jsonArray.optString(0);
JSONObject js2 = new JSONObject(resultOne);
String data = js2.optString("data");
realm.createObjectFromJson(Stock.class, data);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
break;
}
}
}
Person類
package tsou.com.simple.realmtest.bean;
import io.realm.RealmObject;
/**
* Created by Administrator on 2017/12/15 0015.
*/
public class Person extends RealmObject{
private String city;
private String project;
private Men men;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public Men getMen() {
return men;
}
public void setMen(Men men) {
this.men = men;
}
}
Men類
package tsou.com.simple.realmtest.bean;
import io.realm.RealmObject;
/**
* Created by Administrator on 2017/12/15 0015.
*/
public class Men extends RealmObject {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
MorePerson類
package tsou.com.simple.realmtest.bean;
import io.realm.RealmList;
import io.realm.RealmObject;
/**
* Created by Administrator on 2017/12/15 0015.
*/
public class MorePerson extends RealmObject {
private String city;
private String project;
private String time;
private RealmList<Men> mens;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public RealmList<Men> getMens() {
return mens;
}
public void setMens(RealmList<Men> mens) {
this.mens = mens;
}
}