• Android中数据库的操作流程详解


    Android中数据库的操作方法:

    1.Android平台提供了一个数据库辅助类来创建或打开数据库。

    这个辅助类继承自SQLiteOpenHelper类。继承和扩展SQLiteOpenHelper类主要做的工作就是重写下面两个方法。
    (1).onCreate(SQLiteDatabase db) :
    A.当数据库被首次创建时(用户初次使用软件时)运行该方法。一旦数据库存在就不会调用该方法了。


    B.只生成辅助类(继承SQLiteOpenHelper类)对象的时候是不会调用该函数的,唯独当调用辅助类对象的getReadableDataBase或者getWritableDataBase时才会调用该方法。


    C.假设是第一次创建数据库,该方法一定会被调用。


    D.一般将创建表等初始化操作在该方法中运行。
    (2).onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):
    A.当打开数据库时传入的版本号号与当前的版本号号不同一时候会调用该方法。
    B.用于升级软件时更新数据库表结构。


    实现了这两个方法,就能够用它的getWritableDatabase()和getReadableDatabase()来获得数据库(SQLiteDatabase对象)。

    2.强调一下:
    (1).第一次创建数据库时,当实现辅助类对象的getReadableDataBase时或者是调用了getWritableDataBase时,系统自己主动调用onCreate()方法(程序中也能够调用)。


    (2).假设用户须要升级数据库表结构,须要主动调用onUpgrade(SQLiteDatabase db,int oldVersion。int vewVersion)。
    方法:传入一个新的版本号的号。


    (3).继承SQLiteOpenHelper并覆写onCreate(),onUpgrade(),onOpen()(可选)。我们能够创建或打开数据库。并对其进行升级。通过getReadableDataBase和getWritableDataBase获取SQliteDataBase实例。
    (4).通过close关闭数据库。
    3.总结:
    数据库操作流程:
    (1).首先获得数据库对象:
    获得数据库对象的方法:Android平台提供了一个数据库辅助类,继承自SQLiteOpenHelper类。

    实现onCreate()、onUpgrade()两个方法。创建辅助类对象,然后调用getWritableDatabase()和getReadableDatabase()方法获得数据库对象。


    (2).调用数据库的增删改查方法:
    向数据库表中添加、删除、改动、查找数据。
    (3).关闭数据库。


    源代码例如以下:
    (1).DBOpenHelper.java类:

    package com.chengdong.su.jntv.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.os.Environment;
    
    /**
     * 数据库
     * 
     * @author scd
     * 
     */
    public class DBOpenHelper extends SQLiteOpenHelper {
    
        // 构造方法
        public DBOpenHelper(Context context) {
            super(context, DBNAME, null, VERSION);
            mContext = context;
        }
    
        // 版本号
        private static final int VERSION = 200;
        // 数据库名称
        private static final String DBNAME = Environment
                .getExternalStorageDirectory() + "/jndt_db.db";
        private Context mContext;
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 运行创建表语句
            db.execSQL(MediaDBManager.CREATE_TABLE_SQL);
            db.execSQL(ProgramDB.CREATE_TABLE_SQL);
            // 初始化数据
            new MediaDBManager(mContext).initData(db);
            new ProgramDB(mContext).initData(db);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO 自己主动生成的方法存根
            db.execSQL("DROP TABLE IF EXISTS " + ProgramDB.TABLE_NAME);
            db.execSQL("DROP TABLE IF EXISTS " + MediaDBManager.TABLE_NAME);
            onCreate(db);
        }
    }
    

    (2).ProgramDB.java类:

    package com.chengdong.su.menu_fragment_viewpager.db;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.text.TextUtils;
    
    import com.chengdong.su.menu_fragment_viewpager.model.MenuBean;
    
    /**
     * 节目单
     * 
     * @author scd
     */
    
    public class ProgramDB {
    
        public ProgramDB(Context context) {
            mContext = context;
        }
    
        private Context mContext;
        private DBOpenHelper mDBHelper;
        /** 节目单表名 */
        public static final String TABLE_NAME = "D_Program";
        /** 编号 */
        public static final String ID = "Code";
        /** 节目单名称 */
        public static final String NAME = "name";
    
        public static final String CREATE_TABLE_SQL = "CREATE TABLE IF NO EXISTS " + TABLE_NAME
                + "(Code INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT, " + // 节目名称
                "F_BeginTime TEXT, " + // 播出開始时间
                "F_EndTime TEXT, " + // 播出结束时间
                "MediaID TEXT, " + // 所属媒体
                "Director TEXT, " + // 主持人
                "PlayDate TEXT)";// 播放时间
    
        public void initData(SQLiteDatabase db) {
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(mContext.getAssets().open("rawProgramData")));
                String l = null;
                int code = 0;
                while (!TextUtils.isEmpty(l = reader.readLine())) {// 表示一行一行的读
                    // 拆分数据
                    String[] arr = l.split("\|\|");
                    if (arr != null && arr.length >= 5) {
                        StringBuilder sb = new StringBuilder();
                        sb.append("insert into " + TABLE_NAME + " VALUES( ");
                        sb.append(code++).append(","); // 主键编码
                        sb.append(arr[2]).append(","); // 电台名字
                        sb.append(arr[0]).append(","); // 開始时间
                        sb.append(arr[1]).append(","); // 结束时间
                        sb.append("0").append(","); // 所属媒体
                        sb.append(arr[3]).append(","); // 主持人
                        sb.append(arr[4]); // 播放日期
                        sb.append(")");
                        // insert into db
                        db.execSQL(sb.toString());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
        /**
         * 获取数据库
         * 
         * @return
         */
        private SQLiteDatabase getDatabase() {
            if (mDBHelper == null) {
                mDBHelper = new DBOpenHelper(mContext);
            }
            return mDBHelper.getWritableDatabase();
        }
    
        /**
         * query
         */
        public List<MenuBean> find(String date) {
            List<MenuBean> list = new ArrayList<MenuBean>();
            SQLiteDatabase db = getDatabase();
            // query
            Cursor c = db.query(TABLE_NAME, null, "PlayDate like '%" + date + "%'", null, null, null, null);
    
            if (c != null && c.getCount() > 0 && c.moveToFirst()) {
                do {
                    list.add(new MenuBean(c.getInt(c.getColumnIndex("Code")), c.getString(c.getColumnIndex("name")), c
                            .getString(c.getColumnIndex("F_BeginTime")), c.getString(c.getColumnIndex("F_EndTime")), c
                            .getString(c.getColumnIndex("PlayDate"))));
                } while (c.moveToNext());
                // 依照开播时间排序
                Collections.sort(list, new MenuBeanComparator());
            }
            c.close();
            db.close();
            return list;
        }
    
        /**
         * 比較器
         * 
         * @author suchengdong
         */
        private class MenuBeanComparator implements Comparator<MenuBean> {
    
            @Override
            public int compare(MenuBean lhs, MenuBean rhs) {
                return getFormatTime(lhs.getF_BeginTime()).compareTo(getFormatTime(rhs.getF_BeginTime()));
            }
    
            private String getFormatTime(String timeStr) {
                int index = timeStr.indexOf(":");
                if (index > 0) {
                    String hour = timeStr.substring(0, index);
                    if (hour.length() <= 1) {
                        hour = "0" + hour;
                    }
                    return hour + timeStr.substring(index);
                } else {
                    return timeStr;
                }
            }
        }
    }
    
    

    (3).rawProgramData数据源:

    6:00|9:00|城市 Morning Call||1,2,3,4,5|0
    6:00|9:00|早安。音乐。||6,0|0
    9:00|12:00|Music 伴你行||1,2,3,4,5|0
    9:00|12:00|桔子音乐汇||6,0|0
    12:00|14:00|音乐快车道||1,2,3,4,5,6,0|0
    14:00|16:00|音乐咖啡馆||1,2,3,4,5|0
    16:00|19:00|Music Fun(放)轻松||1,2,3,4,5|0
    14:00|19:00|周末音乐吧||6,0|0
    19:00|21:00|音乐超转速||1,2,3,4,5,6,0|0
    21:00|24:00|城市乐光||1,2,3,4,5,6,0|0
    0:00|6:00|音乐不打烊||1,2,3,4,5,6,0|0

    (4).MediaDBManager.java类:

    package com.chengdong.su.jntv.db;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.text.TextUtils;
    
    import com.chengdong.su.jntv.bean.MediaBean;
    
    public class MediaDBManager {
    
        public MediaDBManager(Context context) {
            mContext = context;
        }
    
        private Context mContext;
        private DBOpenHelper mDBHelper;
    
        /** 流媒体表名 */
        public static final String TABLE_NAME = "D_Media";
        /** 编号 */
        public static final String ID = "Code";
        /** 电台名称 */
        public static final String NAME = "Name";
        /** 创建时间 */
        public static final String FM = "FM";
        /** 媒体URL */
        public static final String MEDIAURL = "MediaUrl";
        /** 媒体类型 */
        public static final String MEDIATYPE = "MediaType";
        /** 听众数 */
        public static final String NUMBEROFLISTENER = "NumberOfListener";
        /** 节目类型 */
        public static final String MENUTYPE = "MenuType";
    
        /**
         * 建表语句
         */
        public static final String CREATE_TABLE_SQL = "CREATE TABLE " + TABLE_NAME
                + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME
                + " TEXT," + FM + " TEXT," + MEDIAURL + " TEXT," + MEDIATYPE
                + " TEXT," + NUMBEROFLISTENER + " INTEGER," + MENUTYPE + " TEXT)";
    
        /**
         * 创建数据库
         * 
         * @return
         */
        private SQLiteDatabase getDatabase() {
            if (mDBHelper == null) {
                mDBHelper = new DBOpenHelper(mContext);
            }
            return mDBHelper.getWritableDatabase();
        }
    
        /**
         * 初始化数据
         * 
         * @param db
         */
        public void initData(SQLiteDatabase db) {
    
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(mContext
                        .getAssets().open("rawMediaData")));
                String l = null;
                int code = 0;
                while (!TextUtils.isEmpty(l = reader.readLine())) {// 表示一行一行的读
                    // 拆分数据
                    String[] arr = l.split("\|");
                    if (arr != null && arr.length >= 6) {
                        StringBuilder sb = new StringBuilder();
                        sb.append("insert into " + TABLE_NAME + " VALUES( ");
                        sb.append("'").append(code++).append("',"); // 主键编码
                        sb.append("'").append(arr[0]).append("',"); // 电台名字
                        sb.append("'").append(arr[1]).append("',");
                        sb.append("'").append(arr[2]).append("',");
                        sb.append("'").append(arr[3]).append("',");
                        sb.append("'").append(arr[4]).append("',");
                        sb.append("'").append(arr[5]);
                        sb.append("')");
                        // insert into db
                        db.execSQL(sb.toString());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    
        /**
         * 加入数据
         * 
         * @param bean
         * @return
         */
    
        public long add(MediaBean mediaBean) {
            // TODO
            SQLiteDatabase db = getDatabase();
            ContentValues values = new ContentValues();
    
            values.put(ID, mediaBean.getCode());
            values.put(NAME, mediaBean.getName());
            values.put(FM, mediaBean.getFM());
            values.put(MEDIAURL, mediaBean.getMediaUrl());
            values.put(MEDIATYPE, mediaBean.getMediaType());
            values.put(NUMBEROFLISTENER, mediaBean.getNumberofListener());
            values.put(MENUTYPE, mediaBean.getMenuType());
    
            long data = db.insert(TABLE_NAME, null, values);
            db.close();
            return data;
        }
    
        /**
         * 查询出全部数据
         */
        public List<MediaBean> query() {
            List<MediaBean> list = new ArrayList<MediaBean>();
            SQLiteDatabase db = getDatabase();
            Cursor c = db.query(TABLE_NAME, null, null, null, null, null, null);
            if (c != null && c.getCount() > 0 && c.moveToFirst()) {
                do {
                    list.add(new MediaBean(c.getInt(c.getColumnIndex(ID)), c
                            .getString(c.getColumnIndex(NAME)), c.getString(c
                            .getColumnIndex(FM)), c.getString(c
                            .getColumnIndex(MEDIAURL)), c.getString(c
                            .getColumnIndex(MEDIATYPE)), c.getInt(c
                            .getColumnIndex(NUMBEROFLISTENER)), c.getString(c
                            .getColumnIndex(MENUTYPE))));
                } while (c.moveToNext());
            }
            c.close();
            db.close();
            return list;
        }
    
        /**
         * 依据电台ID,查询电台信息
         * 
         * @param id
         * @return
         */
        public MediaBean queryById(String id) {
            MediaBean media = null;
            SQLiteDatabase db = getDatabase();
            Cursor c = db.query(TABLE_NAME, null, ID + "=?", new String[] { id },
                    null, null, null);
            if (c != null && c.getCount() > 0 && c.moveToFirst()) {
                media = new MediaBean(c.getInt(c.getColumnIndex(ID)), c.getString(c
                        .getColumnIndex(NAME)), c.getString(c.getColumnIndex(FM)),
                        c.getString(c.getColumnIndex(MEDIAURL)), c.getString(c
                                .getColumnIndex(MEDIATYPE)), c.getInt(c
                                .getColumnIndex(NUMBEROFLISTENER)), c.getString(c
                                .getColumnIndex(MENUTYPE)));
            }
            c.close();
            db.close();
            return media;
        }
    
        /**
         * 依据电台url,查询电台信息
         * 
         * @param id
         * @return
         */
        public MediaBean queryByURL(String url) {
            MediaBean media = null;
            SQLiteDatabase db = getDatabase();
            Cursor c = db.query(TABLE_NAME, null, MEDIAURL + "=?

    ", new String[] { url }, null, null, null); if (c != null && c.getCount() > 0 && c.moveToFirst()) { media = new MediaBean(c.getInt(c.getColumnIndex(ID)), c.getString(c .getColumnIndex(NAME)), c.getString(c.getColumnIndex(FM)), c.getString(c.getColumnIndex(MEDIAURL)), c.getString(c .getColumnIndex(MEDIATYPE)), c.getInt(c .getColumnIndex(NUMBEROFLISTENER)), c.getString(c .getColumnIndex(MENUTYPE))); } c.close(); db.close(); return media; } }

  • 相关阅读:
    文件数据源设置
    维护0material主数据,提示Settings for material number conversion not found
    7.5版本COPA数据源创建转换提示“不允许对象名称为空”
    COPA指标自动创建
    IDEA操作数据库
    Docker(快速实战流程)
    Docker(理论部分小结)
    Docker数据卷挂载相关
    解决pycharm启动updating Python interpreter长时间更新
    IDEA完美配置(shell)linux的命令行工具
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5221450.html
Copyright © 2020-2023  润新知