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

}

}



推荐阅读
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 在MFC框架中,存在多个全局函数,用于在不同对象间获取信息或创建新对象。其中,`afxGetApp`函数尤为关键,它能够帮助开发者轻松获取当前应用程序的实例指针。本文将详细解析`afxGetApp`函数的内部机制及其在MFC应用程序中的具体应用场景,探讨其在提升代码可维护性和灵活性方面的优势。此外,还将介绍其他常用全局函数如`AfxWinInit()`和`AfxBeginThread()`的功能和使用方法,为开发者提供全面的参考。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 开发笔记:校园商铺系统中店铺注册功能模块的Controller层优化与重构
    开发笔记:校园商铺系统中店铺注册功能模块的Controller层优化与重构 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 本文介绍了一种利用Dom4j库和JFileChooser组件在Java中实现XML文件自定义路径导出的方法。通过创建一个Document对象并设置根元素,结合JFileChooser选择目标路径,实现了灵活的XML文件导出功能。具体步骤包括初始化Document对象、构建XML结构以及使用JFileChooser选择保存路径,确保用户能够方便地将生成的XML文件保存到指定位置。 ... [详细]
  • 在Java编程中,若需实现两个整数(例如2和3)相除并保留两位小数的结果,可以通过精确计算方法来达到预期效果。具体而言,可以利用BigDecimal类进行高精度运算,确保2除以3的结果准确显示为0.66。此外,还可以通过格式化输出来控制小数位数,确保最终结果符合要求。 ... [详细]
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社区 版权所有