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;
}
}

Android中数据库的操作流程详解的更多相关文章

  1. Android中Service的使用详解和注意点(LocalService)

    Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...

  2. Android中SurfaceView的使用详解

    Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...

  3. Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下     在前面的一篇文章中 ...

  4. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  5. Net Core中数据库事务隔离详解——以Dapper和Mysql为例

    Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...

  6. Android中Application类的详解:

    Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...

  7. Android 中的消息传递,详解广播机制

    --------------------------------------广播机制简介--------------------------------------------- Android中的广 ...

  8. Android中的sharedUserId属性详解

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...

  9. Android中Activity启动模式详解

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

随机推荐

  1. linux命令之mount

    熟悉linux的同学都应该知道mount命令.在linux中,一切皆文件.硬盘分区都是以文件目录的方式存在. 如果我们想访问移动硬盘,U盘等我们必须将这些设备mount到我们linux文件系统中某个目 ...

  2. MarkDown基础使用教程-by sixleaves

    以下是个人浏览文档,结合自己平时使用所总结, 和引用国外关于如何使用markdown的教程.如有不足,还请海涵,期待于您的交流.我觉得使用markdown书写挺好的! 工具下载,可以去下载gitboo ...

  3. poj 1603 Risk_spfa向前星

    poj终于到100题,贴个代码纪念一下,hdu 到400题再贴 题意:有20个城市,接下来有19行告诉你,i城市与n个城市相连,图是双向的,然后叫你求x到y的最小经过几个城市 #include < ...

  4. UITableView 或 UIScrollView 点击状态栏列表回到顶部

    整理来自互联网- 这是tableView继承的scrollView的一个属性 scrollsToTop. 官方说明是这样的: // When the user taps the status bar, ...

  5. 通过YAJL获取json中的值

    这里主要是举例说明一下假设通过yajl获取json中的值. 对于array和object来说,获取的方式略有不同,详细能够參考以下的代码. 我仅仅是从网上搜集信息.知道有这么一种方法.假设还有别的方法 ...

  6. 基于HTML5多图片Ajax上传可预览

    html5多图控件<input id="fileImage" type="file" size="30" name="fil ...

  7. springmvc 传递和接收数组参数

    java url中如何传递数组,springMVC框架controller类如何接收数组参数? 下面介绍一下URL中传递数组参数方法: dd.do?titles[]=col1&titles[] ...

  8. EF项目中应用出现问题???

    最近用EF做了个项目发现很多不便利的地方. 具体如下. 1,我是通过edmx 建模,然后通过模型生成数据库. 虽然数据库已经创建成功但是问题来了,我在加字段,和标的时候再次生成时domeo.edmx. ...

  9. UVA 1153 KEEP THE CUSTOMER SATISFIED

    题意: 钢铁公司有N个客户的订单,每个订单有一个产量q(生产时间刚好也等于q)和订单完成截止时间.公司要求完成尽量多的订单. 分析: 先按截止时间d排序,然后维护一个已经选好的订单的优先队列,如果当前 ...

  10. JSP简介

    论坛 博客 微论 问答 游戏厅 天涯客 读书 更多 手机 服务 登录 注册   聚焦 民生 文学 旅游 财经 汽车 IT数码 时尚 情感 娱乐 视频 更多 北京 上海 广东 更多 天涯部落> J ...