android SQLite数据库使用总结之(二)创建自己的数据库

Android Studio 使用插件Database Navigation 连接 sqlite数据库 Database Navigation 是一款在 Android Studio 开发环境中非常实用的插件,它主要致力于帮助开发者更便捷、高效地管理和操作数据库,尤其是在 Android 项目涉及到数据库相关开发工作时,能够提升开发体验与效率。 阅读详情

1、创建自己的数据库

大多数情况,我们还是需要自己去维护一个数据库,常见的包括数据库的创建,升级,销毁等操作。android提供了SQLiteOpenHelper抽象类,我们创建SQLiteOpenHelper的实现类,重写他的onCreate(), onUpgrade() 或者 onOpen()方法,对数据库进行管理。如下:

package com.ttdevs.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;

public class DataBaseOpenHelper extends SQLiteOpenHelper {
	private static final String DATABASE_NAME = "ChinaCity.db";
	private static final int DATABASE_VERSION = 1; // Version must be >= 1

	public DataBaseOpenHelper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		System.out.println("DataBaseOpenHelper");
		
	}
	public DataBaseOpenHelper(Context context,int version) {
		super(context, DATABASE_NAME, null, version);
		System.out.println("DataBaseOpenHelper version");
	}
	
	@Override
	public void onOpen(SQLiteDatabase db) {
		if(!db.isReadOnly()) { 
			db.execSQL("PRAGMA foreign_keys = ON;"); // Enable foreign key constraints 
		}
		// create table test(id integer references students(id),score integer check (score<=100 and score<=0),primary key(id,score))
		super.onOpen(db);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		CityData.createTable(db);
	}
	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		CityData.dropTable(db);
		CityData.createTable(db);
	}

	public static class CityData implements BaseColumns {
		public static final String TYPE_TEXT = " text ";
		public static final String TYPE_INTEGER = " integer ";
		public static final String COMMA_SEP = ",";
		
		// *******************************china_city_code***********************************
		public static final String TABLE_NAME_CITY = "china_city_code";
		public static final String COLUMN_NAME_PROVINCE = "province";
		public static final String COLUMN_NAME_CITY = "city";
		public static final String COLUMN_NAME_COUNTY = "county";
		public static final String COLUMN_NAME_CODE = "code";
		public static final String SQL_CREATE_CITY = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME_CITY + " (" + 
				_ID + TYPE_INTEGER + " PRIMARY KEY AUTOINCREMENT, " + 
				COLUMN_NAME_PROVINCE + TYPE_TEXT + COMMA_SEP + 
				COLUMN_NAME_CITY + TYPE_TEXT + COMMA_SEP +
				COLUMN_NAME_COUNTY + TYPE_TEXT + COMMA_SEP +
				COLUMN_NAME_CODE + TYPE_INTEGER
				+ " )";
		public static final String SQL_CREATE_CITY_INDEX = "CREATE UNIQUE INDEX IF NOT EXISTS " + COLUMN_NAME_CODE + " ON " + TABLE_NAME_CITY + "(" + COLUMN_NAME_CODE + ")";
		public static final String SQL_DELETE_CITY = "DROP TABLE IF EXISTS " + TABLE_NAME_CITY;
		
		// *******************************china_provinces_code*******************************
		public static final String TABLE_NAME_PROVINCE = "china_provinces_code";
		public static final String COLUMN_NAME_ID = "id";
		public static final String COLUMN_NAME_NAME = "name";
		public static final String SQL_CREATE_PROVINCE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME_PROVINCE + " (" + 
				_ID + TYPE_INTEGER + " PRIMARY KEY AUTOINCREMENT, " + 
				COLUMN_NAME_ID + TYPE_INTEGER + COMMA_SEP + 
				COLUMN_NAME_NAME + TYPE_TEXT
				+ " )";
		public static final String SQL_DELETE_PROVINCE = "DROP TABLE IF EXISTS " + TABLE_NAME_PROVINCE;
		
		public static void createTable(SQLiteDatabase db){
			db.execSQL(SQL_CREATE_PROVINCE);
			db.execSQL(SQL_CREATE_CITY);
			db.execSQL(SQL_CREATE_CITY_INDEX);
		}
		
		public static void dropTable(SQLiteDatabase db){
			db.execSQL(SQL_DELETE_PROVINCE);
			db.execSQL(SQL_DELETE_CITY);
		}
	}
}


构造函数中我们需要传入四个参数,第一个参数为上下文,第二个为数据库名称,第三个参数一般为null,第四个为数据库的版本。onCreate()方法中主要执行数据库的创建操作。onUpgrade()方法主要在数据库升级时调用,源码(android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(boolean writable))中这样描述:

    private SQLiteDatabase getDatabaseLocked(boolean writable) {
        if (mDatabase != null) {
            if (!mDatabase.isOpen()) {
                // Darn!  The user closed the database by calling mDatabase.close().
                mDatabase = null;
            } else if (!writable || !mDatabase.isReadOnly()) {
                // The database is already open for business.
                return mDatabase;
            }
        }

        if (mIsInitializing) {
            throw new IllegalStateException("getDatabase called recursively");
        }

        SQLiteDatabase db = mDatabase;
        try {
            mIsInitializing = true;

            if (db != null) {
                if (writable && db.isReadOnly()) {
                    db.reopenReadWrite();
                }
            } else if (mName == null) {
                db = SQLiteDatabase.create(null);
            } else {
                try {
                    if (DEBUG_STRICT_READONLY && !writable) {
                        final String path = mContext.getDatabasePath(mName).getPath();
                        db = SQLiteDatabase.openDatabase(path, mFactory,
                                SQLiteDatabase.OPEN_READONLY, mErrorHandler);
                    } else {
                        db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?
                                Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,
                                mFactory, mErrorHandler);
                    }
                } catch (SQLiteException ex) {
                    if (writable) {
                        throw ex;
                    }
                    Log.e(TAG, "Couldn't open " + mName
                            + " for writing (will try read-only):", ex);
                    final String path = mContext.getDatabasePath(mName).getPath();
                    db = SQLiteDatabase.openDatabase(path, mFactory,
                            SQLiteDatabase.OPEN_READONLY, mErrorHandler);
                }
            }

            onConfigure(db);

            final int version = db.getVersion();
            if (version != mNewVersion) {
                if (db.isReadOnly()) {
                    throw new SQLiteException("Can't upgrade read-only database from version " +
                            db.getVersion() + " to " + mNewVersion + ": " + mName);
                }

                db.beginTransaction();
                try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        if (version > mNewVersion) {
                            onDowngrade(db, version, mNewVersion);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                    }
                    db.setVersion(mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
            }

            onOpen(db);

            if (db.isReadOnly()) {
                Log.w(TAG, "Opened " + mName + " in read-only mode");
            }

            mDatabase = db;
            return db;
        } finally {
            mIsInitializing = false;
            if (db != null && db != mDatabase) {
                db.close();
            }
        }
    }

当当前版本小于新版本是,会调用onUpgrade()方法。所以上面SQLiteOpenHelper的实现类思路为:构造方法中初始化一下数据库的必要参数,如数据库版本,数据库名等;在onCreate()方法中创建数据库的表;当我们需要对数据库进行升级的时候,修改数据库的版本号,这样就可以触发onUpgrade()方法,这里我们做最简单的处理:drop掉所有表然后重新创建。当然我们还可以在onOpen()方法中做一下数据库的设置操作,如设置外键生效。这样我们的数据库管理类就实现了。


2、拿到数据库对象

有了数据库管理类,对数据库进行操作我们最好封装一个操作类,在这个类中对数据库中的表进行操作。下面的代码也是网上比较常见的(对于数据库对象,也有处理成单例)。先看代码:
package com.ttdevs.db;

import java.util.ArrayList;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

import com.ttdevs.bean.City;
import com.ttdevs.db.DataBaseOpenHelper.CityData;

public class DataBaseManager {

	private DataBaseOpenHelper dbHelper;
	private SQLiteDatabase db;

	public DataBaseManager(Context context) throws SQLException {
		this.dbHelper = new DataBaseOpenHelper(context);
		this.db = dbHelper.getWritableDatabase();
	}

	public CopyOfDataBaseManager(Context context, int version) throws SQLException {
		this.dbHelper = new DataBaseOpenHelper(context, version);
		this.db = dbHelper.getWritableDatabase();
	}

	public void closeDataBase() {
		if (db != null && db.isOpen()) {
			db.close();
		}
	}

	public boolean isInitData(String tableName) {
		int count = 0;
		String sql = "select count(*) from " + tableName;
		Cursor cursor = db.rawQuery(sql, null);
		if (cursor.moveToFirst()) {
			count = cursor.getInt(0);
		}
		return count > 0;
	}

	public void clearTable(String tableName) {
		String sql = "delete from " + tableName + ";";
		sql += "update sqlite_sequence set seq = 0 where name = " + tableName + ";";
		db.execSQL(sql);
	}

	public void insertProvinceData(int id, String name) {
		String sql = "insert into " + CityData.TABLE_NAME_PROVINCE + " (" + CityData.COLUMN_NAME_ID + ","
				+ CityData.COLUMN_NAME_NAME + ") VALUES(" + id + ",'" + name + "');";
		db.execSQL(sql);
		System.out.println(sql);
	}

	// TODO其他一下对表进行的操作
}

首先我们创建一个DataBaseOpenHelper的实例,然后通过它拿到SQLiteDatabase对象,这样我们就可以对数据库进行操作了。DataBaseOpenHelper有两种get方法:getWritableDatabase()和getReadableDatabase(),大家都应该知道着两种方法的含义,getReadableDatabase()拿到的数据库对象不可以进行插入修改等写操作。在这两种方法的说明在我们可能需要注意几点:
a、当我们没有申请数据库操作的权限或者磁盘已满,会报错;
b、数据库的更新可能需要很长时间,因此我们不能在主线程中调用;
c、当我们不再对数据库进行操作时,别忘记关闭数据库

接下来就是数据库的常用操作了


Android sqlite数据库的创建和使用 Android sqlite数据库的创建和使用,入门知识 立即下载

相关推荐

Silvaco TCAD 2018安装后,如何配置TonyPlot 5.0.22.R并解决绘图报错?

本文详细介绍了在Windows系统上安装Silvaco TCAD 2018后,如何正确配置TonyPlot 5.0.22.R并解决常见的绘图报错问题。内容包括版本兼容性分析、环境变量设置、常见错误解决方案以及性能优化建议,帮助用户顺利完成仿真结果的可视化工作。

weixin_31031711的博客 429

Android 基础总结(十)数据存储

Android提供了5种方式来让用户保存持久化应用程序数据。根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: 文件存储数据 使用SharedPreferences存储数据 SQLite数据库存储数据 使用ContentProvider存储数据 网络存储数据 一 文件存储数据 1.1 Android文件的操作模式 1.2 文件相关的操作方法 1.3 文件读写 Android中的文件读写和Java中的文件I/O相同,流程也很简单,下面我们来写个

weixin_44058795的博客 1026

Backtrader 文档学习- 整体架构功能分析理解

backtrader是一个用于开发和执行交易策略的Python框架。它提供了一套完整的工具和功能,使得用户可以方便地进行策略回测、实盘交易以及数据分析。backtrader的入口为Cerebro类,该类将所有输入(Data Feeds)、策略 (Strategy)、观察者(Observers)、策略评估(Analyzers) 、经纪人(Broker)、订单(Order)、交易(Trade)和日志记录(Writers)整合起来,实现回测以及交易,并返回结果和图表。

六月闻君 6330

SQLite 数据库的最佳实践

前面我们只是学习了 SQLite 数据库的基本用法,如果你想继续深入钻研,SQLite 数据库中可拓展的知识就太多了。既然还有那么多的高级技巧在等着我们,自然又要进入到最佳实践环节了。 1.  使用事务         前面我们已经知道,SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。那么在什么情况下才需要使用事务呢?想象以下场景,比如你正

wilim 1387

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2624

3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)

本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。

g9h0i1的博客 979

android操作sqlite数据库及心得

写这篇文章主要是网上的对sqlite的操作太多且太杂,非常多时候都不能非常好的运用到自己的项目中,结构不清晰,我自己写了一篇适合刚刚接触的人看的操作方法。 近来用android时要将一些数据保存起来,一開始用的是preferences,后来要保存的东西多了。发现用preferences明显不能满足要求了,并且发现用这个的话代码就变得有点乱了。所以才開始学习使用sqlite数据...

weixin_34279246的博客 565

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 234

android创建sqlite数据库及在SD卡上创建数据库(二)

二、在SD卡上创建数据库        通过android的SQLiteOpenHelper类的源码,可以看到SQLiteOpenHelper类的getWritableDatabase 这个接口实际上调用的是Context的openOrCreateDatabase方法,而这个方法是不支持带路径的数据库名 称的,也就是说,用这个方法创建的数据库只能放在/data/data/包名称/ 目录下;要

海纳百川,壁立千仞 1万+

微信小程序 - 真机调试调用接口报错{errno: 600001, errMsg: “request:fail -102:net::ERR_CONNECTION_REFUSED},真机运行测试请求异常

微信小程序,真机,调试测试,运行报错,API接口,服务器接口都报错了,小程序报错errno: 600001,小程序报错request:fail -102:net::ERR_CONNECTION_REFUSED,真实手机打开接口全都失效了,微信小程序真机测试失败,微信小程序{errno: 600001, errMsg: "request:fail -102:net::ERR_CONNECTION_REFUSED"},详细解决方法,https,服务器SSL证书,无法解决,服务器更换SSL证书,接口地址改了也不行

🏆 前端领域优质创作者 1万+

基于半经验模型的熔断器燃弧过程计算与分析

本文针对1200V/1250A熔断器建立电弧燃烧半经验模型,通过ANSYS计算弧前时间,结合熔体烧蚀、石英砂烧蚀等物理过程简化建模。模型引入电导率随温度变化函数,利用Matlab拟合实验数据确定参数。分析表明:熔体宽度和节距增加会提高弧压峰值并缩短过零时间;总长固定时,断口数和节距影响较小。弧压峰值需控制在额定电压3倍内,过零时间需满足安全裕度。通过Python代码复现了电弧电导率模型、能量平衡方程及弧压计算,验证了熔体结构尺寸对电弧特性的影响规律。

huanghm88的专栏 261

android数据库降级_Android SQLite (二.数据库创建,升级及降级)

上篇文章简介和常用语法介绍了SQLite数据库的基本信息和一些常用的语法操作,本篇文章主要介绍Android开发过程中SQLite数据库的创建使用和常见问题处理。一.SQLiteOpenHelper介绍对于Android平台来说,我们可以使用系统提供的API轻松实现对SQLite数据库的操作Android提供SQLiteOpenHelper类以便我们创建操作数据库。通常情况下我们会新建一个SQLi...

weixin_32452127的博客 533

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026

YOLO系列算法改进 | Neck改进篇 | 融合FAAFusion傅里叶角度对齐模块 | 攻克多尺度方向特征冲突,角度检测精度飙升! | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用FAAFusion傅里叶角度对齐模块改进Neck部分)

2502_91881744的博客 317

android 数据库 实战,Android SQLite数据库创建和使用实战(二)

这篇就不实战鸟。有些资源还是蛮好的。晒出来和大家分享个链接啥的,网络牛人前辈总是能给我们后辈创造福利,致敬!!!致青春!!!哈哈!关于SQL数据库从基础概念到需微深入的理解描述我从网络发现了一个好网站比课本讲的都好,遂与众人分享,PS:致谢这个网站,致敬!!Android数据库基本操作前面Android SQLite数据库创建和使用实战(一)博文已经附上源码了,资源也有工程。不多解释,算是一个标准...

weixin_36003504的博客 214

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android SQLite (二.数据库创建,升级及降级)

一.SQLite简介和常用语法 二.数据库创建,升级及降级 上篇文章简介和常用语法介绍了SQLite数据库的基本信息和一些常用的语法操作,本篇文章主要介绍Android开发过程中SQLite数据库的创建使用和常见问题处理。 一.SQLiteOpenHelper介绍 对于Android平台来说,我们可以使用系统提供的API轻松实现对SQLite数据库的操作 ...

limushan的博客 363

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android自定义创建sql,Android开发——SQLite数据库(二)android studio创建数据库,进行插入、删除、更新、查询操作...

运行效果:本文对数据库的建立、更新,数据的插入、更新、查询、删除,及事务的处理进行示例讲解。代码里有注释帮助理解。 实现代码:activity_main.xmlDBHelperpackage com.example.administrator.dbexcise.database;import android.content.Context;import android.database.sqlit...

weixin_32129195的博客 772

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android中的SQLite的使用

作者:巨震       通过做课堂练习以及上网查阅一些资料,对Android中的SQLite有了一些了解。在这里和大家一起分享。   Android开发中,可以用两种方式来操作SQLite。第一种,可以使用Android SDK目录下/tools/sqlite3.exe,在本地硬盘上进行数据库和表格的相关操作。假设SDK安装目录为C:\Android_SDK(操作系统为windows)。打开

移动平台应用软件开发技术 1519

android 打开 raw 数据库,Android程序中读取使用已有的SQLite数据库

方法一:先在Manifest 里添加权限:第一步先判断在指定的路劲是否存在,不存在就创建。第二步将android的资源下的数据库复制到指定路径下面。第三步就是根据指定路径打开或者创建数据库,然后得到操作数据库的对象,得到操作数据库的对象了,自然就可以对数据库中的表进行增删改查等操作了。SQLiteDatabase db;private final String DATABASE_PATH = an...

weixin_35677363的博客 369

如何在android studio 中查看数据库

最近对android中数据库那一块刚入门,首先学了下怎么创建数据库然后在android ...

yechiyu167的博客 1852

Android SQLite报错

解决办法:①删除表。打开Device File Explorer,打开data,data,com.example.包名,database中的内容删除,重新运行app。②仔细检查表名,修改成与所创建的表名一致。这种错误出现的原因常见的是由于SQLite.class中的表名写错了,与数据库中的表名不一致,导致表名与创建的表的名称不同而出错。

qq_57179318的博客 837

Android SQLite数据库加密

一、前言 SQLite是一个轻量级的、跨平台的、开源的嵌入式数据库引擎,也是一个关系型的的使用SQL语句的数据库引擎, 读写效率高、资源消耗总量少、延迟时间少,使其成为移动平台数据库的最佳解决方案(如Android、iOS) 但是Android上自带的SQLite数据库是没有实现加密的,我们可以通过Android Studio直接导出应用创建的数据库文件,然后通过如SQLite Expere Personal 这种可视化工具打开数据库文件进行查看数据库的表结构,以及数据,这就导致存储在SQLite中的数据可

殇神马的博客 3513

Android数据存储之Sqlite数据库的俩种使用方式

一概述 在Android开发中数据存储包括 SharedPreference、文件存储、数据库存储、ContentProvider、网络存储,本文讲述使用Sqlite数据库存储的俩种基本使用方式 1、第一种使用SQL语句实现 编写代码逻辑:使用SqliteOpenHelper类创建一个数据库 创建一个访问数据库...

weixin_30737433的博客 137

Android Studio如何查看自己创建的SQLite数据库

Android Studio如何查看自己创建的SQLite数据库 在学习安卓开发的时候,有时候需要建立一个SQLite数据库,在创建完之后,想要查看的时候你不知道在哪里找,并且有时候找到了也不知道如何查看,现在就让我们来了解一下如何找到并查看安卓里的SQLite数据库,效果如下 下面开始操作 一. 找到SQLite数据库 1.如下图所示找到设备的文件 2.找到对应文件,路径为 /data/data/com.example.fileoperation/databases/test.db 3.现在已经找到它

qq_48736958的博客 2万+

安卓数据库SQLite

安卓数据库SQLite

似霰的博客 7984
上一篇: android SQLite数据库使用总结之(一)从加载本地数据库开始
下一篇: 各种小记录
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值