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. 致终将火爆的NFC——ISO14443 TypeA

    毫无疑问,当NFC终端越来越普及,逐渐成为智能手机标配功能后,我们终将迎来NFC的火爆.国内NFC应用最为广泛的将是TypeA,如Mifare.NFC Tag.移动支付等,所以接下来将主要研究Type ...

  2. 学习linux之用户-文件-权限操作

    添加用户组 添加 gropuadd 用户组名 修改 groupmod 用户组名 删除 groupdel 用户组名 添加用户 添加 useradd 用户名 设密码 passwd 密码 删除 userde ...

  3. bzoj3293 [Cqoi2011]分金币&&bzoj1045 [HAOI2008]糖果传递

    Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...

  4. linux内核--进程地址空间(一)

    引言:现代操作系统提供了一种对内存的抽象概念,叫做虚拟存储器,它为每个进程提供了一个大的,一致的,和私有的地址空间.通过一个很清晰的机制,虚拟存储器提供了3个重要的能力: 1)它将主存看成是一个存储在 ...

  5. java SecurityManager

    ---- 众所周知,Java语言具有完善的安全框架,从编程语言,编译器.解释程序到Java虚拟机,都能确保Java系统不被无效的代码或敌对的编译器暗中破坏,基本上,它们保证了Java代码按预定的规则运 ...

  6. 关于js对象值的传递

    结合红宝书和网上的一些文章,记录下自己对关于js对象的值的传递的一些理解. js对象是保存在堆内存中的,当把对象赋值给变量时,是把对象在堆内存的引用(地址)赋值给了变量,变量通过地址来访问对象.下面来 ...

  7. css系列教程--overflow min/maxheight content

    outline:这只轮廓样式,与border类似.写法参考border. overflow/overflow-x/overflow-y:visible/hidden/scroll/auto/no-di ...

  8. SQL Server数据恢复——日志备份

    太坑了,我把数据给删了 “大坑啊,数据被我误删了.”从事数据库相关工作的过程中,我想应该很多人会有过和我一样的遭遇吧?尤其是在进行update或者delete操作的时候,忘记了where条件.这些毁灭 ...

  9. Oracle 12c多租户架构浅析

    Oracle数据库12c的一大创新即是其采用的多租户架构.对于多租户这项新功能,业内的评价褒贬不一.有的声音认为,这项功能的用处不是特别大,但在某些场景或特定的环境下,多租户依然有它的用处.其最大的用 ...

  10. 跳转APP(app之间互相通信)

    摘要 步骤: 1,添加URL Types项 2,配置URL Scheme 3,其他应用的跳转 4,参数的接收   开发IOS项目的时候,有可能会遇到两个APP应用相互调用的需求,比如说:支付宝支付.. ...