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

来源:互联网 发布:1688传淘宝代销规则 编辑:程序博客网 时间:2024/05/16 10:39

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|06:00|9:00|早安,音乐!||6,0|09:00|12:00|Music 伴你行||1,2,3,4,5|09:00|12:00|桔子音乐汇||6,0|012:00|14:00|音乐快车道||1,2,3,4,5,6,0|014:00|16:00|音乐咖啡馆||1,2,3,4,5|016:00|19:00|Music Fun(放)轻松||1,2,3,4,5|014:00|19:00|周末音乐吧||6,0|019:00|21:00|音乐超转速||1,2,3,4,5,6,0|021:00|24:00|城市乐光||1,2,3,4,5,6,0|00: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;    }}
1 0
原创粉丝点击