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

摘要:
如何在Android中操作数据库:1。Android平台提供了一个数据库辅助类来创建或打开数据库。继承和扩展SQLiteOpenHelper类的主要工作是重写以下两个方法OnCreate:A。在首次创建数据库时运行此方法OnUpgrade:A。当打开数据库时传入的版本号与当前版本号不同时,将调用此方法关闭数据库。实现onCreate()和onUpgrade()方法。

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中数据库的操作流程详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇通过JS,全选当前页面所有的复选框SpringBoot 的 bootstrap 和 application 配置文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用phpMyAdmin批量修改Mysql数据表前缀的方法

多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分。而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍的是相对简单的批量修改数据库中表前缀的方法,适用于修改数据库中相同前缀且数据表较多的情况。 此例中假定修改名为“www_sdck_cn”的数据库中前缀为“p...

将excel文件的内容导入sql server数据库的方法

1,首先创建一个相应的表,格式保证和excel文件相同。 2,在导入之前,要把数据库安全限制的开关打开。地点是sql server 构成 tool 的 security 构成里面的机能security构成里面的 open row set & open data source 选项打上钩。确定。 3,输入sql语句,执行导入 例子如下 Codeus...

plsql developer远程连接oracle数据库

问题描述: 使用win7(32位)上pl/sql developer 9.0.6远程连接Linux(64位)的oracle 10.2.0数据库。window上使用的oracle客户端是instantclient-basic-win32-10.2.0.3-20061115及instantclient-sqlplus-win32-10.2.0.3-200611...

IOS(数据库的应用)

在iPhone的开发过程中常常会用到数据库,而SQLite3是iPhone中支持的数据库。下面简单介绍一下iPhone中SQLite3数据库的用法: SQLite3简介 SQLite3是一个轻量级的数据库,完全使用C语言编写,使用简单方便。它是一个嵌入到程序进程的数据库,和其他一些数据库(MySQL,MS SQL)不同,它没有独立的进程。 1、打开数据库...

easyui textarea回车导致datagrid 数据无法展示的问题

textarea换行 在easyui中的datagrid中使用行内编辑时textarea的换行保存到mysql数据库为 在textarea中输入回车符 在js读取textarea中的值有 然后到业务层转换到string中就有可能变成空格形式然后被存入数据库,当在取出此值的时候则会变成空格的形式,因此我们需要将不显示的 替换一下。  在js取textarea...

foreign key constraint fails错误的原因

建表:CREATE TABLE Course ( Cno Char(4) PRIMARY KEY, Cname Char(40), Cpno Char(4), Ccredit Int, FOREIGN KEY (Cpno) REFERENCES Course(Cno) );插入数据:INSERT INTO Course VALUES('1'...