Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android SQLite 建表 面向對象編程 完美封裝 一勞永逸

Android SQLite 建表 面向對象編程 完美封裝 一勞永逸

編輯:關於Android編程

Android項目開發過程中經常使用到SQLite數據對數據進行存儲,每個app都會有各自的數據DB,以及各種表項。這就意味著每次進行app開發都要編寫數據庫以及表項的創建代碼,而這些建庫建表代碼量往往不少,但是大多雷同,只是具體數據不一樣。僅僅拷貝後,替換都覺得麻煩。
為何不將建庫建表封裝起來呢?下次建庫或者建表時只用配置對應的數據庫名,表名以及表屬性字段即可。

1,建庫建表
簡單來說SQLite建表就是利用SQLiteDatabase獲取DBOpenHelper 來執行相應的建表SQL語句即可。SQLiteDatabase對象容易獲取,建庫只用一條拼接後的SQL建庫一句即可,而一個庫中可以存在多張表,每張表的建表語句有些微的不同(應為表字段有差異),故建表語句數對應了需要創建的表數。下面在代碼中體現與說明建庫建表過程。

package com.ws.coyc.wsnote.SQLiteHelper;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import com.ws.coyc.wsnote.SQLiteHelper.Utils.l;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Created by coyc on 16-8-23.
 * before use the SDK you should do SQLiteManager.init();
 * then you can create table by SQLiteManager.crateTable();
 */

public class SQLiteManager {


    /*
    member
     */
    // SQLite
    public SQLiteDatabase db;//數據庫操作對象
    private Context context; //上下文
    private DBOpenHelper dbOpenHelper;//建表所需的幫助類(不懂的另外百度)
    private class DBOpenHelper extends SQLiteOpenHelper {
        public DBOpenHelper(Context context, String name,
                            SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase _db) {
            int size = tables.size();//獲取當前需要建表的數量
            for(int i = 0;i
    private ArrayList tables = new ArrayList<>();//該庫中表對象列表

    /*
    fun
     */
    //constrat
    public SQLiteManager()
    {

    }

    //init 初始化建庫工作,傳入庫名
    public void init(Context context,String DB_name)
    {
        tables.clear();
        this.context = context;
        this.DB_NAME = DB_name;
    }

    private static SQLiteManager instance = null;

    public static SQLiteManager getInstance()//單例模式 方便外部調用
    {
        if(instance == null)
        {
            synchronized (SQLiteManager.class)
            {
                if(instance == null)
                {
                    instance = new SQLiteManager();
                }
            }
        }
        return instance;
    }


    //open 做數據庫操作之前都要調用open方法
    public void open() {

        dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);
        try {
            db = dbOpenHelper.getWritableDatabase();
        } catch (SQLiteException ex) {
            ex.printStackTrace();
            exceptionHandler();
        }
        db.beginTransaction();
    }
    /**
     * 數據庫文件損壞刪除異常處理
     * 
     */
    private void exceptionHandler() {
        if(db == null)
        {
            return;
        }
        File file = new File(db.getPath());
        if (!file.exists()) {
            try {
                if (file.createNewFile()) {
                    open();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //close 長時間不適用數據庫可執行close方法關閉數據庫
    public void close() {

        db.setTransactionSuccessful();
        db.endTransaction();
        if (db != null) {
            db.close();
            db = null;

        }
    }




    //create table 注冊表 外界任何想在該庫下創建的表都必須注冊 注冊後tables列表會增加,這回作用到建表時SQL語句的生成
    public void registerTable(String table_name, ArrayList items)
    {
        Table table = new Table(table_name,"_id",items);

        tables.add(table);
    }
    //兩種不同的注冊方式 建議使用第二種方式進行注冊,因為第二種方式的表對象是外界傳入的,外界可以利用該對象進行更多的操作。詳情見下
    public void registerTable(Table table)
    {
        tables.add(table);
    }

    // get table create sql by items 建表語句拼接代碼 遍歷tables列表,由於每個表又可以有多個字段,故字段類型不同又有對應的語句區別。
    private static String getTableCreateSQLString(Table table) {
        String sql = "create table "+table.table_name;//表名 下面依次是“主鍵”+“item1”+“item2”+.....+"item n" 拼接代碼原理不熟的百度能搜出一大把,這裡只是稍微換了一種形式的寫法。

        sql += "("+table.keyItem+" integer primary key autoincrement";

        int size = table.items.size();

        for(int i = 0;i
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved