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

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

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

创建数据库

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

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

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

一个简单的例子:

MainActivity.java

  1. package cn.lixyz.sqlitedemo;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.view.View;
  8. import android.widget.Button;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12. private Button bt_createDB;
  13. private MyDatabaseHelper myDatabaseHelper;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. bt_createDB = (Button) findViewById(R.id.bt_createDB);
  20.  
  21. myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
  22.  
  23. bt_createDB.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. myDatabaseHelper.getWritableDatabase();
  27. }
  28. });
  29. }
  30.  
  31. @Override
  32. public boolean onCreateOptionsMenu(Menu menu) {
  33. // Inflate the menu; this adds items to the action bar if it is present.
  34. getMenuInflater().inflate(R.menu.menu_main, menu);
  35. return true;
  36. }
  37.  
  38. @Override
  39. public boolean onOptionsItemSelected(MenuItem item) {
  40. // Handle action bar item clicks here. The action bar will
  41. // automatically handle clicks on the Home/Up button, so long
  42. // as you specify a parent activity in AndroidManifest.xml.
  43. int id = item.getItemId();
  44.  
  45. //noinspection SimplifiableIfStatement
  46. if (id == R.id.action_settings) {
  47. return true;
  48. }
  49.  
  50. return super.onOptionsItemSelected(item);
  51. }
  52. }

MyDatabaseHelper.java

  1. package cn.lixyz.sqlitedemo;
  2.  
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6. import android.widget.Toast;
  7.  
  8. /**
  9. * Created by LGB on 2015/10/16.
  10. */
  11. public class MyDatabaseHelper extends SQLiteOpenHelper {
  12.  
  13. public static final String CREATE_BOOK = "create table book (id integer primary key autoincrement,author text ,price real,pages integer,name text)";
  14. private Context mContext;
  15.  
  16. public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
  17. super(context, name, factory, version);
  18. mContext = context;
  19. }
  20.  
  21. @Override
  22. public void onCreate(SQLiteDatabase db) {
  23. db.execSQL(CREATE_BOOK);
  24. Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
  25. }
  26.  
  27. @Override
  28. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  29.  
  30. }
  31. }

activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent">
  4.  
  5. <Button
  6. android:id="@+id/bt_createDB"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="创建数据库" />
  10.  
  11. </LinearLayout>

  执行结果:

在DDMS中查看

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

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

更新数据库

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

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

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

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

MyDatabaseHelper.java

  1. package cn.lixyz.sqlitedemo;
  2.  
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6. import android.widget.Toast;
  7.  
  8. /**
  9. * Created by LGB on 2015/10/16.
  10. */
  11. public class MyDatabaseHelper extends SQLiteOpenHelper {
  12.  
  13. public static final String CREATE_BOOK = "create table book (id integer primary key autoincrement,author text ,price real,pages integer,name text,press text)";
  14. public static final String CREATE_CATEGORY = "create table category(id integer primary key autoincrement,category_name text,category_code integer)";
  15. private Context mContext;
  16.  
  17. public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
  18. super(context, name, factory, version);
  19. mContext = context;
  20. }
  21.  
  22. @Override
  23. public void onCreate(SQLiteDatabase db) {
  24. db.execSQL(CREATE_BOOK);
  25. db.execSQL(CREATE_CATEGORY);
  26. Toast.makeText(mContext,"创建成功",Toast.LENGTH_SHORT).show();
  27. }
  28.  
  29. @Override
  30. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  31. db.execSQL("drop table if exists book");
  32. db.execSQL("drop table if exists category");
  33. onCreate(db);
  34. Toast.makeText(mContext,"更新成功",Toast.LENGTH_SHORT).show();
  35. }
  36. }

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

MainActivity.java

  1. package cn.lixyz.sqlitedemo;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.view.View;
  8. import android.widget.Button;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12. private Button bt_createDB;
  13. private MyDatabaseHelper myDatabaseHelper;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. bt_createDB = (Button) findViewById(R.id.bt_createDB);
  20.  
  21. myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
  22.  
  23. bt_createDB.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. myDatabaseHelper.getWritableDatabase();
  27. }
  28. });
  29. }
  30. }

  运行结果:

  更新成功!

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. django -xadmin 详解 功能实现及orm 的复习

    django 在xadmin中自定义内容的变量及优化汇总 一: 首先下载xadmin pip install git+git://github.com/sshwsfc/xadmin.git@djang ...

  2. 123456123456#1#---###3%%%----com.zzj.SuperPuperID668---前拼show后广--嘻哈水管工-111111

    com.zzj.SuperPuperID668---前拼show后广--嘻哈水管工-1111111111111

  3. [LeetCode] 278. First Bad Version 第一个坏版本

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...

  4. Jenkins - 插件管理

    1 - Jenkins插件 Jenkins通过插件来增强功能,可以集成不同的构建工具.云平台.分析和发布工具等,从而满足不同组织或用户的需求. Jenkins 提供了不同的的方法来安装插件(需要不同级 ...

  5. nvm安装、解决nvm command not found问题、卸载

    安装 nvm是node的包版本管理工具,github地址如下:nvm 安装命令 1 curl -o- https://raw.githubusercontent.com/creationix/nvm/ ...

  6. js:如何获取select选中的值

    我想获取select选中的value,或者text,或者…… 比如这个: <select id="select">    <option value=" ...

  7. 【C/C++开发】TinyXml操作(含源码下载)

    前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手. 这个解析库的模型通过解析XM ...

  8. QT实现支持加密的Sqlite数据库引擎

    Sqlite数据库使用很广泛,我们经常会在发布一些小型软件的时候使用它,因为它不需要安装服务器.QT默认的数据库引擎是支持SQLITE数据库的,但并不支持对数据库加密,不加密的Sqlite数据库任何人 ...

  9. python3 turtle

    一.turtle 1.操控画笔画图,turtle相当于笔头(x头?),有方向 2.https://docs.python.org/3.6/library/turtle.html 二.移动和绘制 imp ...

  10. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...