热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android开发中如何使用SQLite数据库

一.基础知识:1.SQLite的数据类型:NULL:空值。INTEGER:带符号的整型,具体取决有存入数字的范围大

  一.基础知识:

  1.SQLite的数据类型:

  NULL:空值。

  INTEGER:带符号的整型,具体取决有存入数字的范围大小。

  REAL:浮点数字,存储为8-byte IEEE浮点数。

  TEXT:字符串文本。

  BLOB:二进制对象。

  smallint 16位元的整数。

  interger 32位元的整数。

  decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点后有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

  float 32位元的实数。

  double 64位元的实数。

  char(n) n 长度的字串,n不能超过 254。

  varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。

  graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。

  vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000

  date 包含了 年份、月份、日期。

  time 包含了 小时、分钟、秒。

  timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

  datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!

  2.SQLite的基本操作:

  ①SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。

  [java]

  // 创建数据库

  public void onCreate(SQLiteDatabase db)

  // 更新数据库

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

  // 打开数据库

  public void onOpen(SQLiteDatabase db)

  // 得到一个可读SQLiteDatabase对象

  public synchronized SQLiteDatabase getReadableDatabase()

  // 得到一个可写SQLiteDatabase对象

  public synchronized SQLiteDatabase getWriteableDatabase()

  // 创建数据库

  public void onCreate(SQLiteDatabase db)

  // 更新数据库

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

  // 打开数据库

  public void onOpen(SQLiteDatabase db)

  // 得到一个可读SQLiteDatabase对象

  public synchronized SQLiteDatabase getReadableDatabase()

  // 得到一个可写SQLiteDatabase对象

  public synchronized SQLiteDatabase getWriteableDatabase()

  ②SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。

  [java]

  execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;

  rawQuery()方法可以执行select语句。

  query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

  table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。

  columns:要查询出来的列名。相当于select语句select关键字后面的部分。

  selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”

  selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。

  groupBy:相当于select语句group by关键字后面的部分

  having:相当于select语句having关键字后面的部分

  orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;

  limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

  //还有两个,网上貌似都用的比较少,而我们这个例子中采用的是这些:

  public long insert(

  String table, // 待插入的表名

  String nullColumnHack, // 通常设置为null

  ContentValues values // 待插入的数据

  )

  public int update(

  String table, // 待更新的表名

  ContentValues values, // 待更新的内容

  String whereClause, // 选择通过哪个字段来更新

  String [] whereArgs // 为whereClause字段要查询的值

  )

  execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;

  rawQuery()方法可以执行select语句。

  query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)

  table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。

  columns:要查询出来的列名。相当于select语句select关键字后面的部分。

  selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”

  selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。

  groupBy:相当于select语句group by关键字后面的部分

  having:相当于select语句having关键字后面的部分

  orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;

  limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

  //还有两个,网上貌似都用的比较少,而我们这个例子中采用的是这些:

  public long insert(

  String table, // 待插入的表名

  String nullColumnHack, // 通常设置为null

  ContentValues values // 待插入的数据

  )

  public int update(

  String table, // 待更新的表名

  ContentValues values, // 待更新的内容

  String whereClause, // 选择通过哪个字段来更新

  String [] whereArgs // 为whereClause字段要查询的值

  )

  ③下面为网上常用的访问数据库的一般流程:

  [java]

  public void onClick(View v) {

  DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

  SQLiteDatabase db = databaseHelper.getWritableDatabase();

  db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});

  db.close();

  };

  public void onClick(View v) {

  DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

  SQLiteDatabase db = databaseHelper.getWritableDatabase();

  db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});

  db.close();

  };

  二.编程实现:

  1. 界面编辑(reslayoutmain.xml):

  [java]


  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >


  android:text="创建数据库"

  android:id="@+id/ButtonCreate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="增加数据"

  android:id="@+id/ButtonInsert"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="更新数据"

  android:id="@+id/ButtonUpdate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="查询数据"

  android:id="@+id/ButtonQuery"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">




  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >


  android:text="创建数据库"

  android:id="@+id/ButtonCreate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="增加数据"

  android:id="@+id/ButtonInsert"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="更新数据"

  android:id="@+id/ButtonUpdate"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  android:text="查询数据"

  android:id="@+id/ButtonQuery"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content">



  定义了一个垂直方向上的线性布局,及各操作的按钮,水平方向充满父窗口,垂直方向与内容等高。

  界面布局效果如下:

  2. 代码编辑(srcwyfzclMyActivity.java):

  [java]

  package wyf.zcl;

  import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相关包

  import android.app.Activity; //引入相关包

  import android.content.ContentValues; //引入相关包

  import android.database.Cursor; //引入相关包

  import android.database.sqlite.SQLiteDatabase; //引入相关包

  import android.os.Bundle; //引入相关包

  import android.view.View; //引入相关包

  import android.widget.Button; //引入相关包

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private Button createButton; //创建数据库按钮

  private Button insertBut; //增加数据库记录按钮

  private Button updateBut; //更新数据库记录按钮

  private Button queryBut; //查询数据库记录按钮

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  createButton=(Button)findViewById(R.id.ButtonCreate); //实例化创建数据库按钮

  insertBut=(Button)findViewById(R.id.ButtonInsert); //实例化插入数据库按钮

  updateBut=(Button)findViewById(R.id.ButtonUpdate); //实例化更新数据库按钮

  queryBut=(Button)findViewById(R.id.ButtonQuery); //实例化查询数据库按钮

  createButton.setOnClickListener(new View.OnClickListener() {//创建数据库时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  System.out.println("create or open database success!");

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  Toast.makeText(MyActivity.this, "创建或打开数据库", Toast.LENGTH_SHORT).show();

  }});

  insertBut.setOnClickListener(new View.OnClickListener() {//增加数据库记录时调用

  @Override

  public void onClick(View v) {

  ContentValues cv=new ContentValues();

  //得到ContentValues对象

  cv.put("uid", 1);

  //放入键值对,键要与列名一致,值要与列的数据类型一致

  cv.put("uname", "zcl");

  //放入键值对,键要与列名一致,值要与列的数据类型一致

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  Toast.makeText(MyActivity.this, "插入记录", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  sld.insert("sqlitetest", null, cv);//增加数据库记录

  System.out.println("success insert a new content!");

  }});

  updateBut.setOnClickListener(new View.OnClickListener() {

  //更新数据库记录时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);

  //创建数据库

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  ContentValues cv = new ContentValues(); //得到ContentValues对象

  Toast.makeText(MyActivity.this, "更新记录", Toast.LENGTH_SHORT).show();

  cv.put("uname", "zcl_update");

  sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新数据库记录

  System.out.println("success updata the content!");

  }});

  queryBut.setOnClickListener(new View.OnClickListener() {

  //查询数据库记录时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  Toast.makeText(MyActivity.this, "查询记录", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?",

  new String[]{"1"}, null, null, null);

  while(cursor.moveToNext()){ //打印输出

  String name=cursor.getString(cursor.getColumnIndex("uname"));

  System.out.println("query result:"+name);

  }}});

  }

  }

  package wyf.zcl;

  import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相关包

  import android.app.Activity; //引入相关包

  import android.content.ContentValues; //引入相关包

  import android.database.Cursor; //引入相关包

  import android.database.sqlite.SQLiteDatabase; //引入相关包

  import android.os.Bundle; //引入相关包

  import android.view.View; //引入相关包

  import android.widget.Button; //引入相关包

  import android.widget.Toast;

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private Button createButton; //创建数据库按钮

  private Button insertBut; //增加数据库记录按钮

  private Button updateBut; //更新数据库记录按钮

  private Button queryBut; //查询数据库记录按钮

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  createButton=(Button)findViewById(R.id.ButtonCreate); //实例化创建数据库按钮

  insertBut=(Button)findViewById(R.id.ButtonInsert); //实例化插入数据库按钮

  updateBut=(Button)findViewById(R.id.ButtonUpdate); //实例化更新数据库按钮

  queryBut=(Button)findViewById(R.id.ButtonQuery); //实例化查询数据库按钮

  createButton.setOnClickListener(new View.OnClickListener() {//创建数据库时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  System.out.println("create or open database success!");

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  Toast.makeText(MyActivity.this, "创建或打开数据库", Toast.LENGTH_SHORT).show();

  }});

  insertBut.setOnClickListener(new View.OnClickListener() {//增加数据库记录时调用

  @Override

  public void onClick(View v) {

  ContentValues cv=new ContentValues();

  //得到ContentValues对象

  cv.put("uid", 1);

  //放入键值对,键要与列名一致,值要与列的数据类型一致

  cv.put("uname", "zcl");

  //放入键值对,键要与列名一致,值要与列的数据类型一致

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  Toast.makeText(MyActivity.this, "插入记录", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  sld.insert("sqlitetest", null, cv);//增加数据库记录

  System.out.println("success insert a new content!");

  }});

  updateBut.setOnClickListener(new View.OnClickListener() {

  //更新数据库记录时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);

  //创建数据库

  SQLiteDatabase sld=dh.getWritableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  ContentValues cv = new ContentValues(); //得到ContentValues对象

  Toast.makeText(MyActivity.this, "更新记录", Toast.LENGTH_SHORT).show();

  cv.put("uname", "zcl_update");

  sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新数据库记录

  System.out.println("success updata the content!");

  }});

  queryBut.setOnClickListener(new View.OnClickListener() {

  //查询数据库记录时调用

  @Override

  public void onClick(View v) {

  SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库

  Toast.makeText(MyActivity.this, "查询记录", Toast.LENGTH_SHORT).show();

  SQLiteDatabase sld=dh.getReadableDatabase();

  //得到一个SQLiteDatabase对象,用于操控数据库

  Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?",

  new String[]{"1"}, null, null, null);

  while(cursor.moveToNext()){ //打印输出

  String name=cursor.getString(cursor.getColumnIndex("uname"));

  System.out.println("query result:"+name);

  }}});

  }

  }

  (srcwyfzclzclsqlitedbSqLiteDBHelper.java):

  [java]

  package wyf.zcl.sqlitedb;

  import android.content.Context; //引入相关包

  import android.database.sqlite.SQLiteDatabase; //引入相关包

  import android.database.sqlite.SQLiteOpenHelper; //引入相关包

  import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相关包

  public class SqLiteDBHelper extends SQLiteOpenHelper{

  public SqLiteDBHelper(Context context, String name, CursorFactory factory,

  int version) {//继承SQLiteOpenHelper的类,必须有该构造函数

  super(context, name, factory, version);

  }

  @Override

  public void onCreate(SQLiteDatabase db) {

  //创建数据库时调用,此方法是在调用了getReadableDatabase()或getWritableDatabase()后才调用

  db.execSQL("create table sqlitetest(uid long,uname varchar(25))");

  System.out.println("already create a database:sqlitetest.");

  }

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  //升级数据库时掉用

  }

  }

  package wyf.zcl.sqlitedb;

  import android.content.Context; //引入相关包

  import android.database.sqlite.SQLiteDatabase; //引入相关包

  import android.database.sqlite.SQLiteOpenHelper; //引入相关包

  import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相关包

  public class SqLiteDBHelper extends SQLiteOpenHelper{

  public SqLiteDBHelper(Context context, String name, CursorFactory factory,

  int version) {//继承SQLiteOpenHelper的类,必须有该构造函数

  super(context, name, factory, version);

  }

  @Override

  public void onCreate(SQLiteDatabase db) {

  //创建数据库时调用,此方法是在调用了getReadableDatabase()或getWritableDatabase()后才调用

  db.execSQL("create table sqlitetest(uid long,uname varchar(25))");

  System.out.println("already create a database:sqlitetest.");

  }

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  //升级数据库时掉用

  }

  }


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
author-avatar
晨曦dora
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有