Android 第十一课 SQlite 数据库存储

Android 为了让我们能够更加方便的管理数据库,特意提供了一个SQLiteOpenHelper帮助类,通过借助这个类就可以非常简单的对数据库进行创建和升级。

SQLiteOpenHelper是一个抽象类,我们要创建一个自己的帮助类去继承它。SQLiteOpenHelper有两个抽象方法,分别是onCreat()和onUpgrade(),我们必须在自己的帮助类里面重这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库,并返回一个可对数据库进行读写操作的对象。不同的是,当数据不可写入的时候(如磁盘已满),getReadableDatabase()方法返回的对象将以只可读的方式去打开数据库,而getWriteableDatabase()方法将出现异常。

    SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的构造方法即可。

这个构造方法中接收4个参数,第一个参数是Context,第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数表示当前数据库的版本号。

构建出SQLiteOpenHelper的实例之后,再调用他的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。数据库文件通常会放在/data/data/<pack name>/database/目录下。此时,重写的onCreate()方法也会得到执行。所以通常会在这里去处理一些创建表的逻辑。

新建项目DatabaseTest。

我们希望创建一个名为BookStore.db的数据库,然后在这个数据库中新建一张Book表,表中包含主键id、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表语句的。

新建MyDatabaseHelper类继承SQLiteOpenHelper,代码如下:

package com.example.databasetest;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;/*** Created by ZHJ on 2018/3/3.*/public class MyDatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK ="create table Book("+"id integer primary key autoincrement,"+"auto 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;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

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

修改activity_main.xml的代码,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/create_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Create database"/></LinearLayout>

仅仅加入一个按钮,用于创建数据库。最后修改MainActivity中的代码,如下:

package com.example.databasetest;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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);Button createDatabase = (Button) findViewById(R.id.create_database);createDatabase.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dbHelper.getWritableDatabase();}});}
}

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

现在可以运行一下代码。

怎么样才能证明数据库已经创建成功了呢?

我们使用adb shell 来对数据库和表的创建情况进行检查。









本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析SQL Server 2005中的主动式通知机制

一、引言 在开发多人同时访问的Web应用程序&#xff08;其实不只这类程序&#xff09;时&#xff0c;开发人员往往会在缓存策略的设计上狠下功夫。这是因为&#xff0c;如果将这种环境下不常变更的数据临时存放在应用程序服务器或是用户机器上的话&#xff0c;可以避免频繁地往…

Android 第十二课 使用LitePal操作数据库(记得阅读最后面的注意事项哦)

一、LitePal简介 1、(新建项目LitePalTest)正式接触第一个开源库---LitePalLitePal是一款开源的Android 数据库框架&#xff0c;它采用了对象关系映射&#xff08;ORM&#xff09;的模式。2、配置LitePal&#xff0c;编辑app/build.gradle文件&#xff0c;在dependencies闭包中…

listview频繁刷新报错

在Android编程中使用Adapter时&#xff0c;偶尔会出现如下错误&#xff1a;The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI t…

Android 第十三课 SharedPreferences存储

SharedPreferences是使用键值对的方式来存储数据的。当保存一条数据时&#xff0c;需要给这条数据提供一个对应的键&#xff0c;这样在读取数据的时候就可以通过这个键把相应的值取出来。而且支SharedPreferences还支持多种不同的数据类型存储&#xff0c;例如&#xff1a;如果…

DSP的Gel作用

转自&#xff1a;http://blog.csdn.net/azhgul/article/details/6660960最近刚在研究Davinci系&#xff0c;特此MARK下&#xff0c;以资后续学习之用。 DSP的Gel作用 1 GEL文件基本作用 当CCSStudio启动时&#xff0c;GEL文件加载到PC机的内存中&#xff0c;如果定义了StartUp(…

解决关于登录校园网显示不在IP段的问题方案(要看注意事项哦!)

有时&#xff0c;登录校园网&#xff0c;账号和密码都显示正确&#xff0c;但是却显示出“账号只能在指定IP段登录”的问题。 那我们就提供了一个解决方案&#xff1a; 使用WinR,并在输入框&#xff0c;输入cmd命令&#xff1a;&#xff08;如下&#xff09;接着输入&#xff1…

jquery插件编写

jQuery为开发插件提拱了两个方法&#xff0c;分别是&#xff1a; jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。可以理解为添加静态方法。是全局的&#xff08;位于jQuery命名空间内部的函数&#xff09;…

gtk/Glade编程 编译命令不成功 解决方法

摘自&#xff1a;http://blog.chinaunix.net/uid-26746982-id-3433656.html 当我们编写gtk/glade程序&#xff0c;gcc编译时&#xff0c;用如下命令&#xff1a; #gcc -o server server.c pkg-config --cflags --libs gtk-2.0 报错&#xff1a;/tmp/ccoXadAd.o: In function …

Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)

使用LitePal删除数据的方式主要有两种&#xff0c;第一种就是直接调用已存对象的delete()方法&#xff0c;所谓已存储对象就是调用过save()方法的对象&#xff0c;或者说是通过LitePal提供的查询API查出来的对象&#xff0c;都是可以直接使用delete方法来删除对象的。这是比较简…

页面返回顶部(方法比较)

下面就说下简单的返回顶部效果的代码实现&#xff0c;附注释说明。 1. 最简单的静态返回顶部&#xff0c;点击直接跳转页面顶部&#xff0c;常见于固定放置在页面底部返回顶部功能 方法一&#xff1a;用命名锚点击返回到顶部预设的id为top的元素 html代码 <a href"#top…

Android 第十六课 使用LitePal查询数据

LitePal在查询API方面做了非常多的优化&#xff0c;基本上可以满足绝大多数场景的查询需求&#xff0c;并且代码也十分整洁。 例如我们需要查询表中的所有数据&#xff1a; List<books> DataSupport.findAll(Book.class); 没有冗长的参数列表&#xff0c;只需要调用一下…

linux创建桌面图标,和开始菜单栏图标

转自&#xff1a;http://blog.csdn.net/qq_25773973/article/details/50514767 ###环境&#xff1a;Mint17&#xff0c;&#xff08;其他类似的linux系统是一样的&#xff09; 如果开始菜单有图标&#xff0c;创建桌面图标很简单&#xff0c;右键添加到桌面即可。 如果没有&am…

ScrollView中使用ListView

转自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存&#xff0c;在scrollview中直接使用lsitview的话只会显示一个条目&#xff0c;要使他们共存&#xff0c; 据我所知&#xff0c;有三种方法&#xff1a; 1。如果listview的高度…

Android 第十四课 使用LitePal添加数据(更新数据)

我们注意到当你登录一个app&#xff0c;是不是需要先注册呢&#xff1f;&#xff0c;所谓注册&#xff0c;简单地来理解是不是就是把输入框中地数据传入数据库中呢&#xff1f; 这里我们设置简单一点&#xff0c;注册的信息只包括两项&#xff0c;一项是用户名&#xff0c;另一…

微信公众平台的服务号和订阅号

微信公众平台 服务号 订阅号 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html 什么是服务号&#xff1f; 服务号给企业和组织提供更强大的业务服务与用户管理能力&#xff0c;帮助企业快速实现全新的公众…

Android 第十七课 碎片的简单用法及动态添加碎片

Fragment(碎片)是一种可以嵌入在活动当中的UI片段&#xff0c;它可以让程序更加合理和充分的利用大屏幕的空间。碎片和活动太像了&#xff0c;同样都包含布局&#xff0c;都有自己的声明周期&#xff0c;可以将碎片理解为一种迷你型的活动。 新建FragmentTest项目。假设项目已经…

在Linux下禁用键盘、鼠标、触摸板(笔记本)等输入设备

在Linux系统下禁用键盘、触摸板、鼠标等输入设备&#xff0c;可以通过xinput命令来实现&#xff1a;主要涉及&#xff1a;#xinput list#xinput list-props list-number#xinput set-prop list-number func-number 1/0具体操作如下&#xff1a;step1&#xff1a;查看系统中有那些…

委托又给我惹麻烦了————记委托链的取消注册、获取返回值

今天改bug碰到了一个问题&#xff0c;有多个方法注册到了一个事件里去&#xff0c;而这些方法本身又有点儿互斥&#xff0c;因而造成了bug&#xff0c;哥调试半天才发现&#xff0c;郁闷至极&#xff0c;遂复习了以前的知识并进行适当延伸&#xff0c;再将成果记录及分享之&…

Python第一课

对python仰慕已久&#xff0c;今日下定决心学习。可能我是一时头脑发热&#xff0c;但我还是愿意坚持。 先了解一下&#xff1a;命令行模式和Python交互模式 在Windows开始菜单选择“命令提示符”&#xff0c;就进入到命令行模式&#xff0c;它的提示符类似C:\>&#xff1a;…

C++模板专门化与重载

最近在复习C有关知识&#xff0c;又重新看<<Effective C>>&#xff0c;收获颇丰。原来以前看这边书&#xff0c;好多地方都是浅尝辄止。<<Effective C>>条款25&#xff1a;考虑写出一个不抛出异常的swap函数&#xff0c;涉及到C模板专门化(Templates S…