2025-05-24

 

為瞭以後的項目使用Android數據庫更方便,自已寫瞭一個小的應用框架,不知道算不算稱得上框架,反正自已用起來覺得還是挺方便的,參考Hibernate瞭應用思想。

 

業務介紹

 

1、建一個數據庫madfiger.db

 

2、建一個用戶表UserInfo,包含一些用戶基本字段

 

 

 

好瞭那麼我們現在來實現吧

 

 

 

1、新建UserInfo實體類,繼承AbstractBaseModel,UserInfo的類名為數據庫表名,字段分別為實現瞭Get與Set方式的實性字段;

 

 

 

UserInfo代碼如下:

 

Java代碼 

package cn.company.android.project.model;  

 

import java.util.Calendar;  

import java.util.Date;  

import java.util.Locale;  

  

import cn.madfinger.android.core.AbstractBaseModel;  

import cn.madfinger.android.core.util.DateUtils;  

 

public class UserInfo extends AbstractBaseModel{  

    private static final long serialVersionUID = -7079062473198239915L;  

    private String id;  

    private String username;  

    private String password;  

    private String birthday;  

    private int gender;  

    private float weight;  

    private Date createTime=DateUtils.long2Date(Calendar.getInstance(Locale.CHINESE).getTimeInMillis());  

    public UserInfo(){  

        super();  

    }  

    public String getId() {  

        return id;  

    }  

    public void setId(String id) {  

        this.id = id;  

    }  

    public String getUsername() {  

        return username;  

    }  

    public void setUsername(String username) {  

        this.username = username;  

    }  

    public String getPassword() {  

        return password;  

    }  

    public void setPassword(String password) {  

        this.password = password;  

    }  

    public String getBirthday() {  

        return birthday;  

    }  

    public void setBirthday(String birthday) {  

        this.birthday = birthday;  

    }  

    public int getGender() {  

        return gender;  

    }  

    public void setGender(int gender) {  

        this.gender = gender;  

    }  

    public float getWeight() {  

        return weight;  

    }  

    public void setWeight(float weight) {  

        this.weight = weight;  

    }  

    public Date getCreateTime() {  

        return createTime;  

    }  

    public void setCreateTime(Date createTime) {  

        this.createTime = createTime;  

    }  

 

package cn.company.android.project.model;

 

import java.util.Calendar;

import java.util.Date;

import java.util.Locale;

 

import cn.madfinger.android.core.AbstractBaseModel;

import cn.madfinger.android.core.util.DateUtils;

 

public class UserInfo extends AbstractBaseModel{

       private static final long serialVersionUID = -7079062473198239915L;

       private String id;

       private String username;

       private String password;

       private String birthday;

       private int gender;

       private float weight;

       private Date createTime=DateUtils.long2Date(Calendar.getInstance(Locale.CHINESE).getTimeInMillis());

       public UserInfo(){

              super();

       }

       public String getId() {

              return id;

       }

       public void setId(String id) {

              this.id = id;

       }

       public String getUsername() {

              return username;

       }

       public void setUsername(String username) {

              this.username = username;

       }

       public String getPassword() {

              return password;

       }

       public void setPassword(String password) {

              this.password = password;

       }

       public String getBirthday() {

              return birthday;

       }

       public void setBirthday(String birthday) {

              this.birthday = birthday;

       }

       public int getGender() {

              return gender;

       }

       public void setGender(int gender) {

              this.gender = gender;

       }

       public float getWeight() {

              return weight;

       }

       public void setWeight(float weight) {

              this.weight = weight;

       }

       public Date getCreateTime() {

              return createTime;

       }

       public void setCreateTime(Date createTime) {

              this.createTime = createTime;

       }

}

 

 

 

 

AbstractBaseModel代碼如下:

 

Java代碼 

package cn.madfinger.android.core;  

 

import java.io.Serializable;  

import java.lang.reflect.Method;  

import java.util.HashMap;  

import java.util.Iterator;  

import java.util.Map;  

import java.util.Set;  

 

import org.json.JSONObject;  

 

import android.util.Log;  

 

/** 

 * 實體模型基類 

 *  

 * @author wiley 

 */ 

public abstract class AbstractBaseModel implements Serializable {  

 

    private static final long serialVersionUID = -4685989463430616599L;  

    private static String TAG = AbstractBaseModel.class.getSimpleName();  

    private static Map<String, String> TYPES = new HashMap<String, String>();  

      

    static {  

        TYPES.put("date", "TEXT");  

        TYPES.put("string", "TEXT");   

        TYPES.put("integer", "INTEGER");  

        TYPES.put("int", "INTEGER");  

        TYPES.put("short", "INTEGER");  

        TYPES.put("long", "INTEGER");  

        TYPES.put("float", "REAL");  

        TYPES.put("double", "REAL");  

    }   

 

    public AbstractBaseModel() {  

        TAG = this.getClass().getSimpleName();  

    }  

 

    public abstract String getId();  

    public abstract void setId(String id);  

      

    public Set<String> toFieldSet(){  

        return this.toFieldMap().keySet();  

    }  

 

    public Map<String, String> toFieldMap() {  

        Map<String, String> fieldMap = new HashMap<String, String>();  

        Method[] methods = this.getClass().getMethods();  

        try {  

            String propertyName;  

            String typeString;  

            for (Method method : methods) {  

                String methodName = method.getName();  

                if (!methodName.startsWith("get")  

                        || methodName.equalsIgnoreCase("getClass")  

                        || methodName.equalsIgnoreCase("get"))  

                    continue;  

                typeString = method.getReturnType().getSimpleName();  

                propertyName = methodName.substring(3);  

                fieldMap.put(propertyName, typeString);  

            }  

        } catch (Exception e) {  

            Log.e(TAG, e.getMessage());  

        }  

        return fieldMap;  

    }  

 

    public String toCreateTableString() {  

        StringBuilder sb = new StringBuilder();  

        sb.append("CREATE TABLE ");  

        sb.append(this.getClass().getSimpleName());  

        sb.append(" (");  

        int i = 0;  

        Map<String, String> fieldMap = toFieldMap();  

        Iterator<String> it = fieldMap.keySet().iterator();  

        while (it.hasNext()) {  

            String field = (String) it.next();  

            String type = fieldMap.get(field).toLowerCase();  

            if (i++ != 0)  

                sb.append(",");  

            sb.append(field.toUpperCase());  

            sb.append(" " + (TYPES.containsKey(type)?TYPES.get(type):"NONE"));  

            if (field.equalsIgnoreCase("id"))  

                sb.append(" PRIMARY KEY");   

        }  

        sb.append(");");  

        return sb.toString();  

    }  

 

    public String toJSONString() {  

        return this.toJSON().toString();  

    }  

 

    public JSONObject toJSON() {  

        Method[] methods = this.getClass().getMethods();  

        JSONObject json = new JSONObject();  

        Object propertyValue;  

        String propertyName;  

        try {  

            for (Method method : methods) {  

                String methodName = method.getName();  

                if (!methodName.startsWith("get")  

                        || methodName.equalsIgnoreCase("getClass")  

                        || methodName.equalsIgnoreCase("get"))  

                    continue;  

                propertyValue = method.invoke(this, new Object[] {});  

                propertyName = methodName.substring(3);  

                propertyName = Character.toLowerCase(propertyName.charAt(0))  

                        + propertyName.substring(1);  

                json.put(propertyName, propertyValue);  

            }  

        } catch (Exception e) {  

            Log.e(TAG, e.getMessage());  

        }  

        return json;  

    }  

 

package cn.madfinger.android.core;

 

import java.io.Serializable;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

 

import org.json.JSONObject;

 

import android.util.Log;

 

/**

 * 實體模型基類

 *

 * @author wiley

 */

public abstract class AbstractBaseModel implements Serializable {

 

       private static final long serialVersionUID = -4685989463430616599L;

       private static String TAG = AbstractBaseModel.class.getSimpleName();

       private static Map<String, String> TYPES = new HashMap<String, String>();

      

       static {

              TYPES.put("date", "TEXT");

              TYPES.put("string", "TEXT");

              TYPES.put("integer", "INTEGER");

              TYPES.put("int", "INTEGER");

              TYPES.put("short", "INTEGER");

              TYPES.put("long", "INTEGER");

              TYPES.put("float", "REAL");

              TYPES.put("double", "REAL");

       }

 

       public AbstractBaseModel() {

              TAG = this.getClass().getSimpleName();

       }

 

       public abstract String getId();

       public abstract void setId(String id);

      

       public Set<String> toFieldSet(){

              return this.toFieldMap().keySet();

       }

 

       public Map<String, String> toFieldMap() {

              Map<String, String> fieldMap = new HashMap<String, String>();

              Method[] methods = this.getClass().getMethods();

              try {

                     String propertyName;

                     String typeString;

                     for (Method method : methods) {

                            String methodName = method.getName();

                            if (!methodName.startsWith("get")

                                          || methodName.equalsIgnoreCase("getClass")

                                          || methodName.equalsIgnoreCase("get"))

                                   continue;

                            typeString = method.getReturnType().getSimpleName();

                            propertyName = methodName.substring(3);

                            fieldMap.put(propertyName, typeString);

                     }

              } catch (Exception e) {

                     Log.e(TAG, e.getMessage());

              }

              return fieldMap;

       }

 

       public String toCreateTableString() {

              StringBuilder sb = new StringBuilder();

              sb.append("CREATE TABLE ");

              sb.append(this.getClass().getSimpleName());

              sb.append(" (");

              int i = 0;

              Map<String, String> fieldMap = toFieldMap();

              Iterator<String> it = fieldMap.keySet().iterator();

              while (it.hasNext()) {

                     String field = (String) it.next();

                     String type = fieldMap.get(field).toLowerCase();

                     if (i++ != 0)

                            sb.append(",");

                     sb.append(field.toUpperCase());

                     sb.append(" " + (TYPES.containsKey(type)?TYPES.get(type):"NONE"));

                     if (field.equalsIgnoreCase("id"))

                            sb.append(" PRIMARY KEY");

              }

              sb.append(");");

              return sb.toString();

       }

 

       public String toJSONString() {

              return this.toJSON().toString();

       }

 

       public JSONObject toJSON() {

              Method[] methods = this.getClass().getMethods();

              JSONObject json = new JSONObject();

              Object propertyValue;

              String propertyName;

              try {

                     for (Method method : methods) {

                            String methodName = method.getName();

                            if (!methodName.startsWith("get")

                                          || methodName.equalsIgnoreCase("getClass")

                                          || methodName.equalsIgnoreCase("get"))

                                   continue;

                            propertyValue = method.invoke(this, new Object[] {});

                            propertyName = methodName.substring(3);

                            propertyName = Character.toLowerCase(propertyName.charAt(0))

                                          + propertyName.substring(1);

                            json.put(propertyName, propertyValue);

                     }

              } catch (Exception e) {

                     Log.e(TAG, e.getMessage());

              }

              return json;

       }

}

 

 

 

 

實體類新建後配置Sqlite.xml,此文件位與res/string下

 

Xml代碼 

<?xml version="1.0" encoding="utf-8"?> 

<resources> 

    <!– 數據庫版本 –> 

    <string name="database_version">1</string> 

    <!– 數據庫名稱–> 

    <string name="database_name">madfinger.db</string> 

    <!– 數據表對應實列–> 

    <string-array name="model_beans"> 

        <item>cn.company.android.project.model.UserInfo</item> 

    </string-array> 

</resources> 

 

<?xml version="1.0" encoding="utf-8"?>

<resources>

       <!– 數據庫版本–>

       <string name="database_version">1</string>

       <!– 數據庫名稱–>

    <string name="database_name">madfinger.db</string>

    <!– 數據表對應實列–>

    <string-array name="model_beans">

           <item>cn.company.android.project.model.UserInfo</item>

    </string-array>

</resources>

 

 在軟件啟動時new SqlitHelper,那麼在數據庫與表將被自動新建,若需要新建多張表的話隻需要新建多個繼承AbstractBaseModel類的實體類,並添加至sqlite.xml中即可

 

 

 

下面我再將sqlitHelper貼出來

 

 

 

Java代碼 

package cn.madfinger.android.core;  

 

import java.util.LinkedList;  

import java.util.List;  

 

import android.content.Context;  

import android.database.sqlite.SQLiteDatabase;  

import android.database.sqlite.SQLiteOpenHelper;  

import android.util.Log;  

import cn.company.android.project.R;  

import cn.madfinger.android.core.util.StrUtils;  

 

/** 

 * 數據庫初始化 

 * @author wiley 

 * 

 */ 

public class SqliteHelper {  

    private static final String TAG = SqliteHelper.class.getSimpleName();  

 

    private static SQLiteDatabase mWriterHandler;  

    private static SQLiteDatabase mReaderHandler;  

    private static int mVersion;  

    private static String mDatabase;   

    public static List<Class<? extends AbstractBaseModel>> mBeanList = new LinkedList<Class<? extends AbstractBaseModel>>();  

    private DatabaseHelper mDBHelper;  

      

    @SuppressWarnings("unchecked")  

    public SqliteHelper(Context context) {  

        Log.i(TAG, "new SqliteHelper");  

        mVersion=StrUtils.str2int(context.getResources().getString(R.string.database_version), 1);  

        mDatabase=StrUtils.null2string(context.getResources().getString(R.string.database_name), "madfinger.db");  

        String[] modelBeans=context.getResources().getStringArray(R.array.model_beans);  

        if(null!=modelBeans){  

            for(String modelBean:modelBeans){  

                try {  

                    mBeanList.add((Class<? extends AbstractBaseModel>)Class.forName(modelBean));  

                } catch (ClassNotFoundException e) {  

                    Log.d(TAG, "",e);  

                }  

            }  

        }  

        //初始化數據庫  

        if(null!=mBeanList&&mBeanList.size()>0){  

            mDBHelper = new DatabaseHelper(context);  

            mWriterHandler=mDBHelper.getWritableDatabase();  

        }  

    }  

      

      

 

    public SQLiteDatabase getWriterHandler() {  

        if(null==mWriterHandler)  

            mWriterHandler=mDBHelper.getWritableDatabase();  

        return mWriterHandler;  

    }  

      

    public SQLiteDatabase getReaderHandler() {  

        if(null==mReaderHandler)  

            mReaderHandler=mDBHelper.getWritableDatabase();  

        return mReaderHandler;  

    }  

 

    public void release() {  

        if (null != mWriterHandler) {  

            mWriterHandler.close();  

            mWriterHandler = null;  

        }  

        if(null!=mReaderHandler){  

            mReaderHandler.close();  

            mReaderHandler=null;  

        }  

    }  

 

    private static class DatabaseHelper extends SQLiteOpenHelper {  

 

        DatabaseHelper(Context context) {  

            super(context,mDatabase , null, mVersion);  

        }  

 

        @Override 

        public void onCreate(SQLiteDatabase db) {  

            Log.i(TAG, "onCreate ");  

            createTable(db);  

        }  

 

        @Override 

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  

            Log.i(TAG, "Upgrading database from version " + oldVersion + " to " 

                    + newVersion + ", which will destroy all old data");  

 

            // 刪除舊表格  

            deleteTable(db);  

            // 創建新表  

            createTable(db);  

        }  

 

        @Override 

        public void onOpen(SQLiteDatabase db) {  

            super.onOpen(db);  

            Log.i(TAG, "onOpen ");  

        }  

 

        /* 

         * 創建所有表 

         */ 

        private void createTable(SQLiteDatabase db) {  

            Log.i(TAG, "createTable begin");  

            for(Class<? extends AbstractBaseModel> clazz:mBeanList){  

                try {  

                    String sqlString = clazz.newInstance().toCreateTableString();  

                    Log.i(TAG, sqlString);  

                    db.execSQL(sqlString);  

                } catch (IllegalAccessException e) {  

                    Log.e(TAG, "",e);  

                } catch (InstantiationException e) {  

                    Log.e(TAG, "",e);  

                }  

            }  

            Log.i(TAG, "createTable end");  

        }  

 

        /* 

         * 刪除所有表 

         */ 

        private void deleteTable(SQLiteDatabase db) {  

            Log.i(TAG, "deleteTable begin");  

            String sql = "DROP TABLE IF EXISTS ";  

            for(Class<? extends AbstractBaseModel> clazz:mBeanList){  

                Log.i(TAG, sql + clazz.getSimpleName());  

                db.execSQL(sql + clazz.getSimpleName());  

            }  

            Log.i(TAG, "deleteTable end");  

        }  

    }  

 

package cn.madfinger.android.core;

 

import java.util.LinkedList;

import java.util.List;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

import cn.company.android.project.R;

import cn.madfinger.android.core.util.StrUtils;

 

/**

 * 數據庫初始化

 * @author wiley

 *

 */

public class SqliteHelper {

       private static final String TAG = SqliteHelper.class.getSimpleName();

 

       private static SQLiteDatabase mWriterHandler;

       private static SQLiteDatabase mReaderHandler;

       private static int mVersion;

       private static String mDatabase;

       public static List<Class<? extends AbstractBaseModel>> mBeanList = new LinkedList<Class<? extends AbstractBaseModel>>();

       private DatabaseHelper mDBHelper;

      

       @SuppressWarnings("unchecked")

       public SqliteHelper(Context context) {

              Log.i(TAG, "new SqliteHelper");

              mVersion=StrUtils.str2int(context.getResources().getString(R.string.database_version), 1);

              mDatabase=StrUtils.null2string(context.getResources().getString(R.string.database_name), "madfinger.db");

              String[] modelBeans=context.getResources().getStringArray(R.array.model_beans);

              if(null!=modelBeans){

                     for(String modelBean:modelBeans){

                            try {

                                   mBeanList.add((Class<? extends AbstractBaseModel>)Class.forName(modelBean));

                            } catch (ClassNotFoundException e) {

                                   Log.d(TAG, "",e);

                            }

                     }

              }

              //初始化數據庫

              if(null!=mBeanList&&mBeanList.size()>0){

                     mDBHelper = new DatabaseHelper(context);

                     mWriterHandler=mDBHelper.getWritableDatabase();

              }

       }

      

      

 

       public SQLiteDatabase getWriterHandler() {

              if(null==mWriterHandler)

                     mWriterHandler=mDBHelper.getWritableDatabase();

              return mWriterHandler;

       }

      

       public SQLiteDatabase getReaderHandler() {

              if(null==mReaderHandler)

                     mReaderHandler=mDBHelper.getWritableDatabase();

              return mReaderHandler;

       }

 

       public void release() {

              if (null != mWriterHandler) {

                     mWriterHandler.close();

                     mWriterHandler = null;

              }

              if(null!=mReaderHandler){

                     mReaderHandler.close();

                     mReaderHandler=null;

              }

       }

 

       private static class DatabaseHelper extends SQLiteOpenHelper {

 

              DatabaseHelper(Context context) {

                     super(context,mDatabase , null, mVersion);

              }

 

              @Override

              public void onCreate(SQLiteDatabase db) {

                     Log.i(TAG, "onCreate ");

                     createTable(db);

              }

 

              @Override

              public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

                     Log.i(TAG, "Upgrading database from version " + oldVersion + " to "

                                   + newVersion + ", which will destroy all old data");

 

                     // 刪除舊表格

                     deleteTable(db);

                     // 創建新表

                     createTable(db);

              }

 

              @Override

              public void onOpen(SQLiteDatabase db) {

                     super.onOpen(db);

                     Log.i(TAG, "onOpen ");

              }

 

              /*

               * 創建所有表

               */

              private void createTable(SQLiteDatabase db) {

                     Log.i(TAG, "createTable begin");

                     for(Class<? extends AbstractBaseModel> clazz:mBeanList){

                            try {

                                   String sqlString = clazz.newInstance().toCreateTableString();

                                   Log.i(TAG, sqlString);

                                   db.execSQL(sqlString);

                            } catch (IllegalAccessException e) {

                                   Log.e(TAG, "",e);

                            } catch (InstantiationException e) {

                                   Log.e(TAG, "",e);

                            }

                     }

                     Log.i(TAG, "createTable end");

              }

 

              /*

               * 刪除所有表

               */

              private void deleteTable(SQLiteDatabase db) {

                     Log.i(TAG, "deleteTable begin");

                     String sql = "DROP TABLE IF EXISTS ";

                     for(Class<? extends AbstractBaseModel> clazz:mBeanList){

                            Log.i(TAG, sql + clazz.getSimpleName());

                            db.execSQL(sql + clazz.getSimpleName());

                     }

                     Log.i(TAG, "deleteTable end");

              }

       }

}

 

 

 數據庫操作將在後一章節中分享給大傢

 

作者 wiley

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *