热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

详解Android连接MySQL数据库的操作流程及技术要点

在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。

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 find(String date) {

List list = new ArrayList();

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 {

@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() <&#61; 1) {

hour &#61; "0" &#43; hour;

}

return hour &#43; timeStr.substring(index);

} else {

return timeStr;

}

}

}

}

(3).rawProgramData数据源&#xff1a;

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类&#xff1a;

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 &#61; context;

}

private Context mContext;

private DBOpenHelper mDBHelper;

/** 流媒体表名 */

public static final String TABLE_NAME &#61; "D_Media";

/** 编号 */

public static final String ID &#61; "Code";

/** 电台名称 */

public static final String NAME &#61; "Name";

/** 创建时间 */

public static final String FM &#61; "FM";

/** 媒体URL */

public static final String MEDIAURL &#61; "MediaUrl";

/** 媒体类型 */

public static final String MEDIATYPE &#61; "MediaType";

/** 听众数 */

public static final String NUMBEROFLISTENER &#61; "NumberOfListener";

/** 节目类型 */

public static final String MENUTYPE &#61; "MenuType";

/**

* 建表语句

*/

public static final String CREATE_TABLE_SQL &#61; "CREATE TABLE " &#43; TABLE_NAME

&#43; "(" &#43; ID &#43; " INTEGER PRIMARY KEY AUTOINCREMENT," &#43; NAME

&#43; " TEXT," &#43; FM &#43; " TEXT," &#43; MEDIAURL &#43; " TEXT," &#43; MEDIATYPE

&#43; " TEXT," &#43; NUMBEROFLISTENER &#43; " INTEGER," &#43; MENUTYPE &#43; " TEXT)";

/**

* 创建数据库

*

*&#64;return

*/

private SQLiteDatabase getDatabase() {

if (mDBHelper &#61;&#61; null) {

mDBHelper &#61; new DBOpenHelper(mContext);

}

return mDBHelper.getWritableDatabase();

}

/**

* 初始化数据

*

*&#64;param db

*/

public void initData(SQLiteDatabase db) {

BufferedReader reader &#61; null;

try {

reader &#61; new BufferedReader(new InputStreamReader(mContext

.getAssets().open("rawMediaData")));

String l &#61; null;

int code &#61; 0;

while (!TextUtils.isEmpty(l &#61; reader.readLine())) {// 表示一行一行的读

// 拆分数据

String[] arr &#61; l.split("\\|");

if (arr !&#61; null && arr.length >&#61; 6) {

StringBuilder sb &#61; new StringBuilder();

sb.append("insert into " &#43; TABLE_NAME &#43; " VALUES( ");

sb.append("&#39;").append(code&#43;&#43;).append("&#39;,"); // 主键编码

sb.append("&#39;").append(arr[0]).append("&#39;,"); // 电台名字

sb.append("&#39;").append(arr[1]).append("&#39;,");

sb.append("&#39;").append(arr[2]).append("&#39;,");

sb.append("&#39;").append(arr[3]).append("&#39;,");

sb.append("&#39;").append(arr[4]).append("&#39;,");

sb.append("&#39;").append(arr[5]);

sb.append("&#39;)");

// insert into db

db.execSQL(sb.toString());

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (reader !&#61; null) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/**

* 加入数据

*

*&#64;param bean

*&#64;return

*/

public long add(MediaBean mediaBean) {

// TODO

SQLiteDatabase db &#61; getDatabase();

ContentValues values &#61; 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 &#61; db.insert(TABLE_NAME, null, values);

db.close();

return data;

}

/**

* 查询出全部数据

*/

public List query() {

List list &#61; new ArrayList();

SQLiteDatabase db &#61; getDatabase();

Cursor c &#61; db.query(TABLE_NAME, null, null, null, null, null, null);

if (c !&#61; 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&#xff0c;查询电台信息

*

*&#64;param id

*&#64;return

*/

public MediaBean queryById(String id) {

MediaBean media &#61; null;

SQLiteDatabase db &#61; getDatabase();

Cursor c &#61; db.query(TABLE_NAME, null, ID &#43; "&#61;?", new String[] { id },

null, null, null);

if (c !&#61; null && c.getCount() > 0 && c.moveToFirst()) {

media &#61; 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&#xff0c;查询电台信息

*

*&#64;param id

*&#64;return

*/

public MediaBean queryByURL(String url) {

MediaBean media &#61; null;

SQLiteDatabase db &#61; getDatabase();

Cursor c &#61; db.query(TABLE_NAME, null, MEDIAURL &#43; "&#61;?

",

new String[] { url }, null, null, null);

if (c !&#61; null && c.getCount() > 0 && c.moveToFirst()) {

media &#61; 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;

}

}



推荐阅读
author-avatar
Superficial1987542_y3
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有