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

}

}



推荐阅读
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
  • LeetCode 690:计算员工的重要性评分
    在解决LeetCode第690题时,我记录了详细的解题思路和方法。该问题要求根据员工的ID计算其重要性评分,包括直接和间接下属的重要性。本文将深入探讨如何使用哈希表(Map)来高效地实现这一目标。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
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社区 版权所有