热门标签 | 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;

}

}



推荐阅读
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
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社区 版权所有