編輯:關於Android編程
ActiveAndroid和OrmLite都是ORM架構的數據庫,之前使用的是OrmLite,今天研究了一番ActiveAndroid,發現兩者各有千秋,在代碼上,ActiveAndroid要比OrmLite簡潔,輕松幾行代碼就能實現對數據庫的增刪改查;但在版本更新上,ActiveAndroid就要比OrmLite復雜的多了,最頭痛的是需要使用sql語句來操作。另外,在5.0之上的手機上,ActiveAndroid封裝的還不算太好,但是我們可以通過代碼來修復這個bug,盡管如此,ActiveAndroid還是很值得我們去學習的!下面就通過一個簡單的demo來詳解ActiveAndroid的使用。
此demo實現的效果如下:
一,添加依賴,把下面的代碼添加到工程的build.gradle中:
repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
1,在清單文件中配置數據庫名稱和數據庫版本號:
2,自定義Application,需要讓你的Application對象繼承自com.activeandroid.app.Application而不android.app.Application。
然後在清單文件的applicatin下通過name來引用,這樣就完成了ActiveAndroid的初始化工作。
代碼就是這麼簡單:
package com.example.administrator.activeandroid; import com.activeandroid.ActiveAndroid; import com.activeandroid.Configuration; import com.activeandroid.app.Application; /** * Created by ljw on 2016/11/2. */ public class MyApp extends Application { //為了兼容5.0以上的手機,需添加下面的代碼 @Override public void onCreate() { super.onCreate(); Configuration.Builder builder = new Configuration.Builder(this); //手動的添加模型類 builder.addModelClasses(User.class); ActiveAndroid.initialize(builder.create()); } }
然後在清單文件的applicatin下通過name來引用:
android:name=".MyApp"
其實ActiveAndroid創建Model類的初衷和OrmLite的Model類是一樣的,都是orm架構的體現,如果對orm不了解,可以看我之前寫的關於OrmLiate的一篇文章,開篇詳細講解了orm的含義,文章地址:http://blog.csdn.net/ljw124213/article/details/52818942。Model類必須繼承Model,繼承後就不用像OrmLite一樣聲明主鍵了,而且如何查看Model源碼會發現,ActiveAndroid把所以操作數據庫的方法都封裝在了此類中。使用@Table定義表名。@Column用於定義列名。
package com.example.administrator.activeandroid; import com.activeandroid.Model; import com.activeandroid.annotation.Column; import com.activeandroid.annotation.Table; /** * Created by ljw on 2016/11/2. * 1,必須繼承Model,繼承後就不用聲明主鍵了 * 2,按照表名添加字段 * 3,添加注釋 */ @Table(name = "user") public class User extends Model{ @Column private String userName; @Column private int userId; @Column private int age; @Column private String addr; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", userId=" + userId + ", age=" + age + ", addr='" + addr + '\'' + '}'; } }
是不是感到很驚訝?還有創建數據庫和操作表結構,怎麼就開始操作數據庫了,只能說ActiveAndroid封裝的太好了,我們只需對數據庫的名稱和版本號進行配置,Model類寫好,其他的工作都不用操心了,它會默默的在後面幫我們解決。寫到這裡我們肯定會深深的體會到使用ActiveAndroid代碼變得是有多麼的簡潔。
package com.example.administrator.activeandroid; import com.activeandroid.query.Delete; import com.activeandroid.query.Select; import com.activeandroid.query.Update; import java.util.List; /** * Created by ljw on 2016/11/2. * 操作數據庫的工具類 */ public class DbManager { //添加數據 public void insertUser(User user){ //操作數據庫的對象就是實體類本身 user.save(); } //刪除數據 public void deleteUser(User user){ user.delete(); } //更新數據 public void updateUser(User user){ user.setUserName("關羽"); user.setAddr("北京"); //在activeandroid中save既可以創建,也可以修改 user.save(); } //查詢所有的數據 public ListqueryUser(){ List execute = new Select() .from(User.class) //model類 .execute(); return execute; } //條件查詢 public List query(String userName){ List queryName = new Select() .from(User.class) .where("userName = ?", userName) //查詢條件 .execute(); return queryName; } //條件刪除 public void delete(String userName){ new Delete() .from(User.class) .where("userName = ?", userName) .execute(); } //條件更新 public void update(String userName){ Update update = new Update(User.class); update.set("addr = ?","上海") .where("userName=?",userName) .execute(); } }
package com.example.administrator.activeandroid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private DbManager dbManager; private ListView mListView; private Listusers; private ListviewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //對ListView設置點擊條目監聽,點擊某個條目後刪除該條目 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { dbManager.deleteUser(users.get(i)); query(); adapter.notifyDataSetChanged(); } }); //對ListView設置條目長按監聽,長按某個條目實行修改操作 mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { dbManager.updateUser(users.get(i)); query(); adapter.notifyDataSetChanged(); return true; } }); //給ListView設置適配器,在第一次進入頁面時就查詢數據庫 dbManager = new DbManager(); adapter = new ListviewAdapter(); adapter.setUsers(users); //把數據傳遞給適配器 mListView.setAdapter(adapter); query(); } private void initView() { mListView = (ListView) findViewById(R.id.listview); findViewById(R.id.btn1).setOnClickListener(this); findViewById(R.id.btn2).setOnClickListener(this); findViewById(R.id.btn3).setOnClickListener(this); findViewById(R.id.btn4).setOnClickListener(this); } //查詢所有 public void query(){ users = dbManager.queryUser(); adapter.setUsers(users); //給適配器重新設置數據 adapter.notifyDataSetChanged(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn1: //插入數據 //第一次使用user對應的表的時候,如果有這張表就直接使用,沒有就創建表 //user表對應的實體類繼承於Model類,此類中提供了一些操作數據庫的工具類 User user = new User(); user.setAddr("信陽"); user.setAge(28); user.setUserId(1); user.setUserName("張飛"); dbManager.insertUser(user); query(); break; case R.id.btn2: //條件查詢 users = dbManager.query("張飛"); adapter.setUsers(users); //給適配器重新設置數據 adapter.notifyDataSetChanged(); break; case R.id.btn3: //條件刪除 dbManager.delete("張飛"); query(); break; case R.id.btn4: //條件更新 dbManager.update("張飛"); query(); break; } } }
import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; /** * Created by ljw on 2016/11/2. */ public class ListviewAdapter extends BaseAdapter { private Listusers; public void setUsers(List users) { this.users = users; } @Override public int getCount() { return users == null ? 0 : users.size(); } @Override public Object getItem(int i) { return users.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder; if (view == null){ view = View.inflate(viewGroup.getContext(),R.layout.item,null); holder = new ViewHolder(); holder.tv = (TextView) view.findViewById(R.id.tv); view.setTag(holder); }else { holder = (ViewHolder) view.getTag(); } holder.tv.setText(users.get(i).toString()); return view; } private class ViewHolder{ TextView tv; } }
1,activity_main.xml:
上面的代碼完全能夠實現ActiveAndroid的功能了,但ActiveAndroid的數據庫升級不像其他數據庫升級那麼簡單,只需改變版本號就行了,下面介紹一下ActiveAndroid的版本升級的步驟:
1,先把數據庫版本改為要升級到的版本,如改為2
2,在工程下新建assets/migrations,在該目錄下增加一個修改過得版本號,比如我現在的版本號升級為2,則文件夾名為2.sql。
3,在2.sql文件夾下使用sql語句來編寫版本升級新增的功能,如新增了一個字段:
ALTER TABLE user ADD COLUMN Count INTEGER;
OK,到這裡ActiveAndroid的使用已經完成了。
前言 在微信剛流行的時候,在搖一搖還能用來那啥的時候,我也曾深更半夜的拿著手機晃一晃。當時想的最多的就是,我靠,為神馬搖一下需要用這麼大的力度,當時我想可能騰訊覺
目前的應用市場上,使用毛玻璃效果的APP隨處可見,比如用過微信語音聊天的人可以發現,語音聊天頁面就使用了高斯模糊效果。先看下效果圖: 仔細觀察上圖,我們可以發現
一個好的應用與用戶的體驗分不開,用戶體驗好就是對事件的處理適當.要處理好Android事件處理,就必須了解Android中事件的傳遞過程.下面是我對Andorid事件的理
一. 三級緩存簡介如上圖所示,目前App中UI界面經常會涉及到圖片,特別是像“今日關注”新聞這類app中,圖片運用的幾率十分頻繁。當手機上需要顯示