当前位置: 首页 > news >正文

Android学习笔记(十六)——数据库操作(上)

  //此系列博文是《第一行Android代码》的学习笔记,如有错漏,欢迎指正!

  Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类我们可以方便地对数据库进行创建和升级。首先,由于SQLiteOpenHelpe是一个抽象类,所以我们需要创建一个类来继承它。SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库) ,并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。

  SQLiteOpenHelper中有两个构造方法可供重写, 一般使用参数少一点的那个构造方法即可。这个构造方法中接收四个参数,第一个参数是 Context,这个没什么好说的,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。下面我们来试一试数据库的使用。


一、新建 MyDatabaseHelper类继承自 SQLiteOpenHelper:

 1 public class MyDatabaseHelper extends SQLiteOpenHelper {
 2     public static final String CREATE_BOOK = "create table book ("
 3             + "id integer primary key autoincrement, "
 4             + "author text, "
 5             + "price real, "
 6             + "pages integer, "
 7             + "name text)";
 8     private Context mContext;
 9     public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory
10             factory, int version) {
11         super(context, name, factory, version);
12         mContext = context;
13     }
14     @Override
15     public void onCreate(SQLiteDatabase db) {
16         db.execSQL(CREATE_BOOK);
17         Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
18     }
19     @Override
20     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
21     }
22 }

  我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用了 SQLiteDatabase 的 execSQL()方法去执行这条建表语句,并弹出一个 Toast提示创建成功,这样就可以保证在数据库创建完成的同时还能成功创建 Book 表。

 

二、编写布局文件:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 3     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 4     android:paddingRight="@dimen/activity_horizontal_margin"
 5     android:paddingTop="@dimen/activity_vertical_margin"
 6     android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
 7 
 8     <Button
 9         android:id="@+id/create_database"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:text="Create database"
13         />
14 </RelativeLayout>
View Code

   我们在界面中加入了一个按钮,用于创建数据库。

 

三、修改 MainActivity中的代码:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     private MyDatabaseHelper dbHelper;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
 9         Button createDatabase = (Button) findViewById(R.id.create_database);
10         createDatabase.setOnClickListener(new View.OnClickListener() {
11             @Override
12             public void onClick(View v) {
13                 dbHelper.getWritableDatabase();
14             }
15         });
16     }
17 }
View Code

   我们在 onCreate()方法中构建了一个 MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为 BookStore.db,版本号指定为 1,然后在 Create database 按钮的点击事件里调用了 getWritableDatabase()方法。这样当第一次点击 Create database按钮时,就会检测到当前程序中并没有 BookStore.db这个数据库, 于是会创建该数据库并调用 MyDatabaseHelper中的 onCreate()方法,这样 Book表也就得到了创建,然后会弹出一个 Toast提示创建成功。再次点击 Create database按钮时,会发现此时已经存在 BookStore.db数据库了,因此不会再创建一次。

  程序运行如下:

  

  此时进入到com.mycompany.database/databases 中可看到BookStore已被创建了:

  

   这个目录下出现了两个数据库文件,一个正是我们创建的 BookStore.db,而另一个BookStore.db-journal 则是为了让数据库能够支持事务而产生的临时日志文件,通常情况下这个文件的大小都是 0 字节。

 

  //End.

 

转载于:https://www.cnblogs.com/Vincent-Bryan/p/5405699.html

相关文章:

  • IPS简单使用方法
  • Android--JNI编程详解
  • shiro中的shiro:principal /标签的使用
  • Facebook Like Button在IE上的bug
  • linux安装VNC服务
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 传球接力
  • 数据库表分割技术浅析
  • number 90分的暴力
  • Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?
  • 推荐一个linux下的web压力测试工具神器webbench
  • Jquery(四)——动态篇
  • 怎么解决numpy和matplotlib无法安装问题
  • node.js入门篇
  • UIBezierPath画圆弧的记录
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • classpath对获取配置文件的影响
  • IDEA常用插件整理
  • java8-模拟hadoop
  • JAVA多线程机制解析-volatilesynchronized
  • jquery cookie
  • JS题目及答案整理
  • Leetcode 27 Remove Element
  • Mysql优化
  • SQLServer之创建显式事务
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue2.0项目引入element-ui
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 分布式熔断降级平台aegis
  • - 概述 - 《设计模式(极简c++版)》
  • 配置 PM2 实现代码自动发布
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微服务核心架构梳理
  • 在weex里面使用chart图表
  • 怎么把视频里的音乐提取出来
  • ​520就是要宠粉,你的心头书我买单
  • #include<初见C语言之指针(5)>
  • #pragma once
  • #Spring-boot高级
  • #Z2294. 打印树的直径
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $.ajax中的eval及dataType
  • (1)(1.13) SiK无线电高级配置(五)
  • (第61天)多租户架构(CDB/PDB)
  • (三)模仿学习-Action数据的模仿
  • (学习日记)2024.01.09
  • .htaccess配置常用技巧
  • .Net core 6.0 升8.0
  • .net MySql
  • .net操作Excel出错解决
  • ?
  • @Pointcut 使用
  • @RunWith注解作用
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大