Android中数据库的操作流程详细解释
2015-06-27 17:13
537 查看
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类:
(2).ProgramDB.java类:
(3).rawProgramData数据源:
(4).MediaDBManager.java类:
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.jntv.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 android.util.Log; import com.chengdong.su.jntv.bean.MenuBean; import com.chengdong.su.jntv.tool.DateUtil; /** * 节目单 * * @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 D_Program(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 >= 6) { StringBuilder sb = new StringBuilder(); sb.append("insert into " + TABLE_NAME + " VALUES( "); sb.append("'").append(code++).append("', "); // 主键编码 sb.append("'").append(arr[2].trim()).append("', "); // 电台名字 sb.append("'") .append(DateUtil.getFormatTime(arr[0].trim())) .append("', "); // 开始时间 sb.append("'") .append(DateUtil.getFormatTime(arr[1].trim())) .append("', "); // 结束时间 sb.append("'").append(arr[5].trim()).append("', "); // 所属媒体 sb.append("'").append(arr[3].trim()).append("', "); // 主持人 sb.append("'").append(arr[4].trim()); // 播放日期 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, String parentId) { List<MenuBean> list = new ArrayList<MenuBean>(); SQLiteDatabase db = getDatabase(); // query Cursor c = db.query(TABLE_NAME, null, "PlayDate like '%" + date + "%' AND MediaID=? ", new String[] { parentId }, 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")), c.getString(c .getColumnIndex("MediaID")))); } while (c.moveToNext()); // 按照开播时间排序 Collections.sort(list, new MenuBeanComparator()); } c.close(); db.close(); return list; } /** * 查询 * * @param date * 播放日期 * @param mediaId * 媒体Id * @return */ public List<MenuBean> query(String date, String mediaId) { List<MenuBean> list = new ArrayList<MenuBean>(); SQLiteDatabase db = getDatabase(); // query Cursor c = db.query(TABLE_NAME, null, "PlayDate like '%" + date + "%'" + " AND MediaID=?", new String[] { mediaId }, null, null, "MediaID"); 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")), c.getString(c .getColumnIndex("MediaID")))); } while (c.moveToNext()); } 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; } } } /** * 查询正在播放的节目 * * @param mediaId * 媒体Id * @param date * 播放的日期(周几) * @param time * 当前系统的时间 * @return */ public MenuBean queryPlay(String mediaId, String date, String time) { MenuBean bean = null; SQLiteDatabase db = getDatabase(); // query Cursor c = db.query(TABLE_NAME, null, "PlayDate like '%" + date + "%'" + " AND MediaID=? AND F_BeginTime<=? AND F_EndTime>?", new String[] { mediaId, time, time }, null, null, "Code", "1"); if (c != null && c.getCount() > 0 && c.moveToFirst()) { bean = 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")), c.getString(c .getColumnIndex("MediaID"))); } else { Log.e("!!!!!", "mediaId: " + mediaId + " date: " + date + " time: " + time); } c.close(); db.close(); return bean; } }
(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; } }
相关文章推荐
- Android Xposed框架出现java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation问题
- Android高通平台调试Camera驱动全纪录
- Android高通平台调试Camera驱动全纪录
- 高通 android平台LCD驱动分析
- 高通 android平台LCD驱动分析
- android JBOX2D粒子碰撞的实例,以达到特殊效果
- 在android中做一个竖着的seekbar效果
- Android Dialog使用举例
- 国内如何下载 Android source code
- Android APK 签名比对详解
- Android中摇一摇效果的实现
- android 开源框架Universal-Image-Loader解析
- Android Chronometer(定时器)
- android快速开发--常用utils类
- Android实现ButterKnife
- Android屏幕适配全攻略(最权威的官方适配指导)
- android 倒计时控件
- Android按钮点击监听事件的写法
- android studio打包APK
- android 自定义对话框 位置