編輯:關於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 List queryUser(){
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 List users;
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 List users;
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的使用已經完成了。
Android搖一搖振動效果Demo
前言 在微信剛流行的時候,在搖一搖還能用來那啥的時候,我也曾深更半夜的拿著手機晃一晃。當時想的最多的就是,我靠,為神馬搖一下需要用這麼大的力度,當時我想可能騰訊覺
Android 高仿微信語音聊天頁面高斯模糊(毛玻璃效果)
目前的應用市場上,使用毛玻璃效果的APP隨處可見,比如用過微信語音聊天的人可以發現,語音聊天頁面就使用了高斯模糊效果。先看下效果圖: 仔細觀察上圖,我們可以發現
Andorid事件傳遞過程
一個好的應用與用戶的體驗分不開,用戶體驗好就是對事件的處理適當.要處理好Android事件處理,就必須了解Android中事件的傳遞過程.下面是我對Andorid事件的理
Android 之 三級緩存(內存!!!、本地、網絡)及內存LruCache擴展 及源碼分析--- 學習和代碼講解
一. 三級緩存簡介如上圖所示,目前App中UI界面經常會涉及到圖片,特別是像“今日關注”新聞這類app中,圖片運用的幾率十分頻繁。當手機上需要顯示