編輯:關於Android編程
Android開發中常用的數據庫有5個:
GreenDAO小於100KB,所以對於應用程序APK的大小影響很小。
相比SQLite,Realm更快並且具有很多現代數據庫的特性,比如支持JSON,流式api,數據變更通知,以及加密支持,這些都為安卓開發者帶來了方便。
Ream提供了五種編程方式的實現。分別是Java,Objective C,Swift,React-Native,tamarin。在這裡我著重介紹在Android中的使用。
大家可以直接看官方的文檔,我也是在這基礎的上講解:realm使用
快速入門:
第一步:在項目的 build.gradle 文件中添加如下 class path 依賴。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:1.0.0"
}
}
項目的
build.gradle文件在如下位置:
第二步:在 app 的 build.gradle 文件中應用
realm-android插件。
apply plugin: 'realm-android'
app的
build.gradle文件在如下位置:
如果讀者使用的是maven構建項目,官方也有說明,這裡我就不列出來了。
說到這裡,我們已經迫不及待的想嘗試下了。
1,application裡面初始化
public class RealmApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init() {
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfiguration);
}
}
2,創建工具管理類,獲取Realm實例
public class RealmUtils {
private static RealmUtils instance;
public final Context mContext;
private String realmName = "realm_demo.realm";
public RealmUtils(Context mContext) {
this.mContext = mContext;
}
public static RealmUtils getInstance(Context context){
if (instance == null) {
synchronized (RealmUtils.class) {
if (instance == null) {
instance = new RealmUtils(context);
}
}
}
return instance;
}
public Realm getRealm(){
Realm realm =Realm.getInstance(new RealmConfiguration.Builder(mContext).name(realmName).build());
return realm;
}
}
3,創建一個realmObject對象,存儲object
例如,我們現在需要存儲一個人(Person)對象,注意,這裡的成員屬性為了realm的序列化,都寫成私有的
public class Person extends RealmObject {
@PrimaryKey
private String code;//編號
private String name;//姓名
private int age;//年齡
public Person() {
}
public Person(int age, String code, String name) {
this.age = age;
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
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;
}
@Override
public String toString() {
return "Person{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
4,定義幾個CRUD的方法,供其它類實現
public interface PersonDao {
//插入
void insert(Person person) throws Exception;
//查詢
List getAllPerson() throws Exception;
//更新
Person updatePerson(Person person) throws Exception;
//刪除
void deletePerson(String code) throws Exception;
// 異步插入
void insertPersonAsync(Person person) throws Exception;
}
5,對象的具體實現
public class PersonDaoImpl implements PersonDao {
private Context context;
private Realm mRealm;
public PersonDaoImpl(Context context){
mRealm = RealmUtils.getInstance(context).getRealm();
}
@Override
public void insert(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealm(person);
mRealm.commitTransaction();
mRealm.close();
}
@Override
public List getAllPerson() throws Exception {
List mlist = null;
mlist = mRealm.where(Person.class).findAll();
mRealm.close();
return mlist;
}
@Override
public Person updatePerson(Person person) throws Exception {
mRealm.beginTransaction();
Person person1 = mRealm.copyToRealmOrUpdate(person);
mRealm.commitTransaction();
mRealm.close();
return person1;
}
@Override
public void deletePerson(String code) throws Exception {
Person person = mRealm.where(Person.class).equalTo("code",code).findFirst();
mRealm.beginTransaction();
person.deleteFromRealm();
mRealm.commitTransaction();
}
@Override
public void insertPersonAsync(final Person person) throws Exception {
//一個Realm只能在同一個線程中訪問,在子線程中進行數據庫操作必須重新獲取Realm對象:
mRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.beginTransaction();
Person person1 = realm.copyToRealm(person);
realm.commitTransaction();
realm.close();//並且要記得在離開線程時要關閉 realm.close();
}
});
//關閉Realm對象
mRealm.close();
}
}
6,測試
public class MainActivity extends AppCompatActivity {
private Realm mRealm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
Person person = new Person();
person.setName("測試");
person.setAge(28);
person.setCode("xxxx");
PersonDao dao = new PersonDaoImpl(this);
try {
//增加
dao.insert(person);
//查詢全部
dao.getAllPerson();
//指定code刪除
dao.deletePerson("xxxx");
//更新
dao.updatePerson(person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
其實這和以前的用法差不多的,有點在於,realm去幫我們管理這個數據庫,並且在安全上我這還沒有講到,這裡只講了基本用法,大家可以去看看官方的文檔說明:
官方文檔
Android 深入解析selector selector類同於shape都是xml文件設置控件的屬性,然後再進行引用。 selector 基本屬性如下:
我們總是出門後才發現忘了關電腦,或是忘了從電腦中拷貝重要數據,難道還得跑回家一趟?嘿嘿,想在外網環境下遠程控制PC,其實沒有那麼復雜。如果某位童鞋擔心遇到上
之前寫過一篇關於Android 繼承DialogFragment彈出dialog對話框一,這次是在上次的基礎上修改了一些東西,就是怎樣在DialogFragment中獲取
先熟悉幾個Android屏幕的計量單位屏幕尺寸:指的是手機實際的物理尺寸也就是屏幕的對角線的長度,比如常用的4.0英寸,4.7英寸,5.0英寸,5.5英寸。單位 英寸in
1.TextView Textview在之前的學習中用到過好多