设为首页 收藏本站
查看: 1156|回复: 0

[经验分享] Android15_SQLite使用方法

[复制链接]

尚未签到

发表于 2016-11-29 10:46:28 | 显示全部楼层 |阅读模式
  一、SQLite介绍
  SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
  
   DSC0000.gif
  二、SQLiteOpenHelper使用方法
  JAVA中使用JDBC来访问数据库,而Android则设计使用一套自己的API来访问数据库,必须要是用到SQLiteOpenHelper方法来访问数据库,不使用也可以,但会很麻烦。SQLiteOpenHelper是一个管理数据库的创建、版本等操作的帮助类。可以创建一个子类去实现一些方法。
  使用SQLiteOpenHelper来访问数据库必须要使用一些方法:
  getReadableDatabase():创建或者打开一个可读的数据库,会返回一个SQLiteDatabase对象,基于这个对象可以进行增删改查操作。
  getWritableDatabase():创建或者打开一个(可读)可写的数据库,同样也会返回一个SQLiteDatabase对象,基于这个对象可以进行增删改查操作。
  onCreate(SQLiteDatabase db):回调函数,当数据库第一次被创建的时候就会调用。
  onOpen(SQLiteDatabase db):回调函数,当数据库被打开的时候就会被调用。
  onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):回调函数,当数据库被更新的时候就会被调用。
  close():关闭数据库。
  三、使用adb访问SQLite
  adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse时adb进程就会自动运行。
  
  adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(如G1手机). 它的主要功能有:
  
  1)运行设备的shell(命令行)
  
  2) 管理模拟器或设备的端口映射
  
  3) 计算机和设备之间上传/下载文件
  
  4)将本地apk软件安装至模拟器或android设备
  
  ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备.
  打开命令行,输入adb,就会看到adb的相关命令。如果看到的是adb不是内部或外部命令这个提示,说明环境变量没有配置好,以前path只配置了sdk目录下的tools,对于旧版本中adb.exe就在该目录下,可以正常启动。但是对于新版本sdk,adb.exe被移动到了platform-tools目录下,这一点需要注意。
DSC0001.png

  输入adb shell就进入Linux命令,以Linux命令来操作Android模拟器了,因为Android是以Linux内核开发的。
DSC0002.png

  如果此时提示device not found:
DSC0003.png

  则是因为模拟器没有启动,需要先启动模拟器,启动模拟器可以从Eclipse上的Opens Android SDK and AVD Manageer上选择需要启动的模拟器进行启动,也可以从命令行进行启动:
DSC0004.png

  另:如果不知道自己的模拟器名称可以使用list AVD命令查看
DSC0005.png

  SQLite数据库放在./data/data/当前虚拟机运行的应用程序的包名/databases/目录里。当没有创建数据库的时候,是没有databases目录的,只有当数据库创建成功时才有。(我的程序包名均为com.android.activity)
  
    DSC0006.png
  此时只有lib目录,没有databases目录。当运行创建程序之后,就会创建databases目录,且该目录下有数据库。
  部分创建代码:

//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db");
//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
  执行之后:
  
    DSC0007.png
  databases中的test_sqlite_db就是我们创建的数据库文件。要想使用这个文件必须使用sqlite的命令:
  
    DSC0008.png
 .schema用于查看当前有哪些表,以及建表语句。
  在sqlite>下具体的操作和在其他数据库中基本一致,该不赘述。
  四、SQLite增删改查
  我们自己创建SQLite数据库的操作类DatabaseHelper需要继承SQLiteOpenHelper类。
  DatabaseHelper.java

package com.android.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
//设置数据库默认版本为1
private static final int VERSION = 1;
//在SQLiteOpenHelper的子类中,必须有该构造函数
//参数说明:一个Activity对象,表名,,当前数据库版本
public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
public DatabaseHelper(Context context, String name) {
this(context, name, VERSION);
}
public DatabaseHelper(Context context, String name,int version) {
super(context, name, null, version);
}
//该方法第一次创建数据库的时候执行,实际上是第一次得到SQLIteDatabase对象的时候执行的
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("create a database");
db.execSQL("create table user(id int,name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//此处可以用于添加更新操作
System.out.println("upgreate a database");
}
}
  DatabaseHelper作为一个访问SQLite的帮助类,提供了两个方面的功能:

 1) getReadableDatabase(),getWriteableDatabase()可以获得SQLiteDatabase对象,并将那些相关的数据库操作

 2) 提供了onCreate和onUpgrade两个回调函数,运行在创建和升级数据库的时候,进行自己的操作
  在SQLiteOpenHelper的子类中,必须有构造函数

DatabaseHelper(Context context, String name, CursorFactory factory,int version)
  可以重载多个构造方法。
  main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView  
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/createDatabase"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="createDatabase"
/>
<Button
android:id="@+id/updateDatabase"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="updateDatabase"
/>
<Button
android:id="@+id/insert"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="insert"/>
<Button
android:id="@+id/update"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="update"/>
<Button
android:id="@+id/query"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="query"/>
</LinearLayout>

  SQLiteActivity.java

package com.android.activity;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.android.db.DatabaseHelper;
public class SQLiteActivity extends Activity {
private Button createButton;
private Button insertButton;
private Button updateButton;
private Button updateRecordButton;
private Button queryButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//得到对象
createButton = (Button)findViewById(R.id.createDatabase);
updateButton = (Button)findViewById(R.id.updateDatabase);
insertButton = (Button)findViewById(R.id.insert);
updateRecordButton = (Button)findViewById(R.id.update);
queryButton = (Button)findViewById(R.id.query);
//添加监听器
createButton.setOnClickListener(new CreateListener());
updateButton.setOnClickListener(new UpdateListener());
insertButton.setOnClickListener(new InsertListener());
updateRecordButton.setOnClickListener(new UpdateRecordListener());
queryButton.setOnClickListener(new QueryListener());
}
class CreateListener implements OnClickListener{
public void onClick(View v) {
//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db");
//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class UpdateListener implements OnClickListener{
public void onClick(View v) {
//更新“数据库”,调用了第三个构造方法,由于默认版本为1,此处设置为2,则android会自动调用onUpgrade方法。
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db",2);
SQLiteDatabase db = dbHelper.getReadableDatabase();
}
}
class InsertListener implements OnClickListener{
public void onClick(View v) {
//生成ContentValues对象,和map对象差不多,存放的都是键值对
ContentValues values = new ContentValues();
//想在该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
values.put("id", 1);
values.put("name","bauble");
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db",2);
SQLiteDatabase db = dbHelper.getWritableDatabase();
//调用insert方法,就可以将数据插入到数据库当中,三个参数:表名、默认空值,ContentValues对象
db.insert("user", null, values);
}
}
//更新数据操作就相当于执行SQL语句当中的update语句
class UpdateRecordListener implements OnClickListener{
public void onClick(View v) {
//得到一个可写的SQLiteDatabase对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db");
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "allorry");
//第一个参数是要更新的表名
//第二个参数是一个ContentValeus对象
//第三个参数是where子句
db.update("user", values, "id=?", new String[]{"1"});
}
}
class QueryListener implements OnClickListener{
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_sqlite_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("query--->" + name);
}
}
}
}
  例子解释:
  1) 在CreateListener这个监听器中是用来创建数据库的,创建数据库必须要先创建一个DatabaseHelper对象,同时调用的是DatabaseHelper两个参数的构造方法,分别为当前Activity的对象,以及要创建的数据库的名字。并且只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库。
  2) UpdateListener是用来更新数据库的,不是更新数据的。由于默认数据库版本为1,此处设置为2,则android会自动调用onUpgrade方法。
  3) 插入数据必须使用ContentValues对象进行数据的存储、传递。contentValue对象和Map差不多,存放的都是键值对。想在该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致。由于插入数据,相对于修改,所以版本号为2。最后调用insert方法就可以将数据插入到数据库当中,三个参数:表名、如果ContentValues对象为空时的默认值,ContentValues对象。
  4) 更新数据操作需要使用ContentValues对象存储需要更新的列名以及更新后的值。最后调用DatabaseHelper的update方法,参数分别为表名、contentValues对象,where子句,此时相当于JDBC的PrepareStatement的方法使用?作为占位符,在后面的String数组中设置占位符的值。
  5) 数据查询是调用query方法,该方法参数众多,一般的参数为:表名、存储要查询列的String型数组、where子句、占位符数组、groupby、having、orderby。返回值为Cursor类型,循环调用cursor的moveToNext方法即可。
  运行界面:
  
    DSC0009.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307145-1-1.html 上篇帖子: Android SQLite Database 下篇帖子: Using Python in Sqlite !
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表