SQLite是内置于Android的一款轻量级关系型数据库,她运算速度快,占用资源少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。

SQLite不仅支持标准的SQL语法,还遵循数据库的ACID事务,所以如果有其他数据库基础,会上手很快。与其他数据库不同的是,SQLite不用设置用户名和密码就可以使用。

和其他数据库不同的是,SQLite没有其他数据库那么多繁杂的数据类型,它的数据类型很简单:integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型

创建数据库

SQLiteOpenHelper抽象类可以帮我们对数据库进行创建和升级。

继承SQLiteOpenHelper需要实现它的两个方法:onCreate()和onUpgrade(),然后在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper中还有两个方法getReadableDatabase()和getWirtableDatabase(),这两个方法都可以创建或打开一个现有的数据库并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候,getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWirtableDatabase()将抛出异常。

一个简单的例子:

MainActivity.java

package cn.lixyz.sqlitedemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button bt_createDB;
private MyDatabaseHelper myDatabaseHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_createDB = (Button) findViewById(R.id.bt_createDB); myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); bt_createDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

MyDatabaseHelper.java

package cn.lixyz.sqlitedemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; /**
* Created by LGB on 2015/10/16.
*/
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book (id integer primary key autoincrement,author text ,price real,pages integer,name text)";
private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/bt_createDB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库" /> </LinearLayout>

  执行结果:

在DDMS中查看

我们使用navicat打开这个db文件:

可见,数据库和表创建成功了。

更新数据库

假如我们要添加一个新表,或者更改表中的一个字段,我们该怎么办呢?还是和之前一样吗?我们试一下:

我们将MyDatabaseHelper中的SQL语句修改为:

create table book (id integer primary key autoincrement,author text ,price real,pages integer,name text,press text)

执行点击按钮发现并没有弹出创建成功,原因是因为BookStore.db已经存在了,无论你怎么点击按钮,onCreate方法都不会再执行了,那么该怎么办呢?onUpgrade方法可以解决这个问题:

MyDatabaseHelper.java

package cn.lixyz.sqlitedemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast; /**
* Created by LGB on 2015/10/16.
*/
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table book (id integer primary key autoincrement,author text ,price real,pages integer,name text,press text)";
public static final String CREATE_CATEGORY = "create table category(id integer primary key autoincrement,category_name text,category_code integer)";
private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
} @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);
Toast.makeText(mContext,"更新成功",Toast.LENGTH_SHORT).show();
}
}

  执行,还是不成功,原来还需要修改一个位置,我们需要修改数据库的版本号,以表示我们对数据库升级了

MainActivity.java

package cn.lixyz.sqlitedemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button bt_createDB;
private MyDatabaseHelper myDatabaseHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_createDB = (Button) findViewById(R.id.bt_createDB); myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2); bt_createDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
});
}
}

  运行结果:

  更新成功!

Android笔记(三十九) Android中的数据存储——SQLite(一) create的更多相关文章

  1. Android笔记(十九) Android中的Fragment

    通常我们使用Activity来展示界面,但是在手机上界面可能显示的很好看,但在平板上,因为平板的屏幕非常大,手机的界面放在平板上可能会出现控件被拉长.控件之间间距变大等问题.为了更好的体验效果,在Ac ...

  2. Android笔记三十四.Service综合实例二

    综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName ...

  3. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  4. Android笔记(四十) Android中的数据存储——SQLite(二) insert

    准备工作: 我们模拟一个注册的页面,先看UI 我们需要创建一个数据库:user,数据库包含表user,user表包含字段id.username.password.mobilephone MainAct ...

  5. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  6. Android笔记(六十九) 仿微信界面(一)

          综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...

  7. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  8. Android笔记(四十一) Android中的数据存储——SQLite(三)select

    SQLite 通过query实现查询,它通过一系列参数来定义查询条件. 各参数说明: query()方法参数 对应sql部分 描述 table from table_name 表名称 colums s ...

  9. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  10. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

随机推荐

  1. linux命令(11)环境变量:查看和添加环境变量

    linux 环境变量系统: 系统级别:/etc/profile./etc/bashrc/ ./etc/environment 用户级别:~/.profile.~/.bashrc. ~/.bash_pr ...

  2. 这42个Python小例子,太走心

    告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 <  ...

  3. CNeo编程语言概述

    C语言诞生于1970年,当时在AT&T实验室由Dennis Ritchie主导开发的.据说当时仅用了一周的时间就做好了C语言编译器,所以尽管C语言从90年正式纳入ISO标准委员会,其编号为IS ...

  4. git初次登陆使用

    一. 安装git 二. 在当前项目根目录点击鼠标右键,出来下图: 点击进入git命令行界面. 三.初始化项目 git init 四. 添加所有文件到项目中 git add . 五. 尝试提交所有文件 ...

  5. pycharm 2019.2 安装包失败

    简介: 最近使用学生账号注册了pycharm,貌似全家桶都可以免费用了,就升级了pycharm到最新版. 但是在使用包管理,安装包的时候出错了 提示没有匹配的版本,下面还提示一个 --trusted- ...

  6. mysql or条件查询优化

    当使用or的时候是不会用到索引的 explain SELECT * FROM aladdin_resource WHERE state = 1 OR state = 2; 解决办法就是用union替换 ...

  7. 记RDS数据库表数据误删恢复

    1.登录阿里云RDS后台,找到“备份”入口,如下图: 2.下载最近的备份数据,如下图: 3.解压,找到误删数据的表,如下图:(这里拿sys_role举例) 4.在本机(Windows系统), a. 装 ...

  8. svn 版本控制搭建

    1.安装SVN yum install subversion 2.开启服务 systemctl start svnserve.service 3.创建仓库 svnadmin create /opt/s ...

  9. Integer的parseInt和valueOf的区别

    先来看一下下面这段代码 String s = "1"; System.out.println(Integer.valueOf(s)); System.out.println(Int ...

  10. 3.JVM 垃圾收集器

    Garbage Collect(垃圾回收) 1.1 如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾. 1.1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用, ...