SQLite数据库存储(上)

创建数据库

Android专门提供了一个 SQLiteOpenHelper帮助类对数据库进行创建和升级

SQLiteOpenHelper需要创建一个自己的帮助类去继承它并且重写它的两个抽象方法,即 onCreate() 和 onUpgrade()

SQLiteOpenHelper 中有两个重要的实例方法:getReadableDatabase() 和 getWritableDatabase(),第一个方法可以在磁盘空间已满的时候,只读数据,而第二种方法在空间已满的时候,则会出现异常

创建一个名为 BookStore.db 的数据库

在这个数据库中新建一张 book表,表中有 id(主键)、作者、价格、页数和书名等列

我们在我们的项目当中新建 MyDatabaseHelper类,并继承自 SQLiteOpenHelper,后面则可以在我们的主活动当中启用这段新建的代码,这个类的代码如下:

package com.example.lenovo.studyittwo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_BOOK = "create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)"; private Context mContext;//至于为什么我们要使用下面这段代码以及为什么要定义这个私有的变量,书上并没有写我也不知道 /**
* 构造方法
* @param context
* @param name 数据库名
* @param factory 允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null
* @param version 当前数据库的版本号,可用于对数据库进行升级操作
*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
} /**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//SQLiteDatabase这个数据库是本身就存在的,并不需要我们自己去写,因为在前面的代码当中我们已经进行了import操作
// 执行建表语句
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"创建数据库功",Toast.LENGTH_LONG).show();
} /**
* 升级数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

下面是主活动的代码。也十分容易理解,我们在一个按钮的事件当中加入主活动与这个类相联系的函数就可以了:

package com.example.lenovo.studyittwo;

import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 构建MyDatabaseHelper对象,指定数据库名为"BookStore.db、版本号为1
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, ); Button btn_create_database = (Button) findViewById(R.id.creat);
btn_create_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建或打开一个现有的数据库(已存在则打开,否则创建一个新的)虽然这很显然,但是我们怎么创建或者打开自己所指定的数据库呢?难道就只能够打开我们刚刚创建的这一个数据库吗?
dbHelper.getWritableDatabase();
}
}); }}

下面是我们主界面的代码,只需要创建一个按钮就可以了:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <Button
android:id="@+id/creat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Creat database"/> </android.support.constraint.ConstraintLayout>

最后,我们只需要按住这个按钮,界面上就会弹出“数据库创建成功”的toast资阳区,再次点击的时候就不会出现了,但我们可以使用另外的的方法来查看我们创建数据库成功没,打开cmd就可以很容易地查看了。

二.往数据库当中再添加新表的方法

假设我们往数据库当中加入category这张表的话,代码首先从我们刚刚创建的类里在添加一段创建表的代码就可以了,同时在建表语句onCreate函数下添加建表语句

 db.execSQL(CREATE_CATEGORY);

最后我们在

 onUpgrade()方法内写上:
  db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category")
  onCreate(db);
这样子就可以避免我们必须卸载我们的软件才可以在点击create database之后出现“新建数据库成功”的Toast字样。
代码如下:
package com.example.lenovo.studyittwo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_BOOK = "create table book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)"; public static final String CREATE_CATEGORY="create table Category("
+"id integer primary key autoincrement,"
+"category_name text,"
+"category_code integer)"; private Context mContext;//至于为什么我们要使用下面这段代码以及为什么要定义这个私有的变量,书上并没有写我也不知道 /**
* 构造方法
* @param context
* @param name 数据库名
* @param factory 允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null
* @param version 当前数据库的版本号,可用于对数据库进行升级操作
*/
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
} /**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 执行建表语句
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"创建数据库功",Toast.LENGTH_LONG).show();
} /**
* 升级数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
} }

在写完这段代码之后,由于我们使用了

onUpgrade()函数

因此我们在主活动当中对代码进行一定的更改,将主活动当中的
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
更改成:
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
确保后面的版本号为2才可以使用这个升级的函数,具体主活动的代码如下:
package com.example.lenovo.studyittwo;

import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 构建MyDatabaseHelper对象,指定数据库名为"BookStore.db、版本号为1,版本号改为2之后则会直接
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, ); Button btn_create_database = (Button) findViewById(R.id.creat);
btn_create_database.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建或打开一个现有的数据库(已存在则打开,否则创建一个新的)
dbHelper.getWritableDatabase();
}
}); }}

最终就可以得到新表插入成功的结果了。


安卓开发笔记(十二):SQLite数据库储存(上)的更多相关文章

  1. 安卓开发笔记(二十六):Splash实现首页快速开屏功能

    我们在进行安卓开发的时候,首页开有两种方式,一种是利用handler将一个活动进行延时,时间到达之后软件则会跳转到第二个活动当中.而另一种方法则是更加常用的方法,利用splash实现首页的快速开屏,这 ...

  2. 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互

    实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了.在读取本地html并展示在前台的时候,并不需要在Androidmenifast ...

  3. 安卓开发笔记(二十八):仿写IOS switch选择器控件实现,checkbox

    我们先来看看效果: 这里我们主要使用了github上的一个开源项目,配置起来比较方便,下面解释一下该如何使用:首先是:Gradle文件当中进行配置: dependencies { implementa ...

  4. 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)

    1.为什么要集成腾讯X5内核? X5内核相对于系统webview,具有下述明显优势: 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使流量节省20 ...

  5. 安卓开发笔记(二十):利用夜神模拟器调试运行Android Studio的apk

    一.首先来到夜神模拟器的安装目录下 如下图所示: 再把这整个文件夹添加到我们的windows环境变量里.然后再把android studio 和夜神模拟器都打开,注意必须同时打开而且不能够把夜神模拟器 ...

  6. 安卓开发笔记(二十五):ViewPager的使用

    首先我们来看看运行之后的效果: 然后我们也不多说废话了,下面是这个项目所需要的全部代码,很多博主写这个都不把代码写完,因此笔者自己也琢磨了一会儿才把这个弄出来,感觉很烦,但我肯定会把代码写全的.我这里 ...

  7. 安卓开发笔记(二十一):Android Studio如何创建assets目录

    方法如下: 因为在用WebView控件查看安卓内置网页的时候,必须创建这个资源文件夹,将网页放置在这个目录之下,默认是没有assets这个目录的,这样才可以实现网页代码html.css.javascr ...

  8. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  9. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  10. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

随机推荐

  1. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  2. Codeforces Round #483 (Div. 2) D. XOR-pyramid

    D. XOR-pyramid time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...

  3. PAT1037:Magic Coupon

    1037. Magic Coupon (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The magi ...

  4. js中的对象创建与继承

    对象创建 1.工厂模式 优点:解决了创建多个相似对象的问题 缺点:没有解决对象识别问题:每一个对象都有一套自己的函数,浪费资源 function createPerson(name, age, job ...

  5. hibernate入门-基本配置及简单的crud操作

    框架来说主要是需要写大量的配置文件,hibernate相比mybatis来说更强大,移植性更好: 1.类和数据库的映射配置:配置文件命名一般--类名.hbm.xml (user.hbm.xml),与实 ...

  6. Python简介之输入和输出

    输出 输入 输出 用print()在括号中加上字符串就可以向屏幕上输出指定的文字.比如输出'hello,world!',用代码实现如下:print('hello world!'). print()函数 ...

  7. req_params.go

    , fmt.Sprintf("%s: closing %s", proto, listener.Addr())) }

  8. Dubbo中编码和解码的解析

    (这里做的解析不是很详细,等到走完整个流程再来解析)Dubbo中编解码的工作由Codec2接口的实现来处理,回想一下第一次接触到Codec2相关的内容是在服务端暴露服务的时候,根据具体的协议去暴露服务 ...

  9. 阅读nsq源码 ---初步架构设计图

     

  10. 【cogs 775】山海经 ——Segment Tree

    题目链接:      TP 题解:   我数据结构真心是弱啊= =. 线段树好厉害啊,一直不会区间最大连续和,今天刚学习了一下233. 维护前缀最大和后缀最大,越界最大(?),再维护一个区间最大,瞎搞 ...