SQLiteDatabase数据库操作详解

今天花了点时间总结了一下数据的相关知识android中系统自带的数据库SQLiteDatabase数据库,这种数据库操作起来比ormLite数据库(第三方的)麻烦点,但是我对这种数据库操作比较熟悉所以我就采用了这种数据库,如有错误欢迎大家批评指正,谢谢

1.SQLiteDatabase

SQLiteDatabase本身是一个数据库的操作类,但是如果想进行数据库的操作,还需要android.database.sqlite.SQLiteOpenHelper类的帮助,在执行SQL语句时execSQL()方法不能返回一个值

下图为Android中对execSQL()方法的说明

2.SQLiteOpenHelper(摘自李兴华android实战开经典)

SQLiteOpenHelper是数据库操作的辅助类,并且它是一个抽象类,所以使用时需要定义其子类,并且在子类中复写相应的抽象方法。

在SQLiteOpenHelper类中定义了三个回调方法。

2.1 onCreate()

此方法在第一次使用数据库时调用生成相应的数据库表,但是此方法并不是在实例化SQLiteOpenHelper类的对象时调用,而是通过对象调用了getReadableDatabase()或getWriteableDatabase()方法时才会调用。

2.2 onUpgrade()

当数据库升级时会调用此方法,一般可以再此方法中将数据表删除,并且在删除表之后往往会调onCreate()方法重新创建新的数据表。

2.3 onopen()

当数据库打开时会调用此方法,但是一般情况下用户不需要复写此方法。

3.Android中数据库的增删改查示例代码

3.1布局图如下

3.2主机面的代码如下:

package com.example.contentvaluespractice;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

     private SQLiteDatabase db;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
           setContentView(R.layout. activity_main);

           SQLiteOpenHelper helper= new DatabaseHelper(this);//SQLiteOpenHelper帮助类进行数据库的操作
           //执行oncreate 方法返回数据库。db数据库只有在执行了getWritetableDatabase()或getReadableDatabase()方法后执行Oncreate()方法才创建
            db=helper.getWritableDatabase();
     }

     //向数据库中插入数据的两种方式,一种是通过sql语句,一种是通过android提供的方法
     public void insert(View view){

      //插入数据的sql语句方法
      String sql="insert into personData(name,age,birthday) values ('dmk',null,'1988-9-10')";//sql语句执行插入操作
      db.execSQL(sql);

      //插入数据的第二种方式android中提供的方法

      //使用ContentValues进行插入操作ContentValues相当于java中的Map以键值对的形式存在
      ContentValues cv= new ContentValues();
      cv.put("name", "dmj");
      cv.put("age", 26);
      db.insert("personData", null,cv);

     }

   //从数据库中删除数据两种方式,一种是通过sql语句,一种是通过android提供的方法
   public void delete(View view){
        //1.使用android中的方式
       String whereClause= "name=?"; //删除条件
       String[] whereArgs={ "dmk"};
       db.delete("personData", whereClause, whereArgs);
      //2.使用execSQL方式实现
       String sql= "delete from personData where name='dmj'" ;
       db.execSQL(sql);
     }
  //更新数据库中的数据2种方式
   public void update(View view){
    //1.使用安卓中的ContentValues
    ContentValues cv= new ContentValues();
    cv.put( "name", "df"); //添加要更改的字段及内容
//  String whereClause="name=?";
//  String[] whereArgs={" dmk"};
//  db.update("personDate", cv, whereClause, whereArgs);
    db.update("personData", cv, "name=?", new String[]{"dmk"});

    //2.使用execSQL的方式实现
    String sql= "update [personData] set age=20 where name='dmj'";
    db.execSQL(sql);   //execSQL()方法不能返回一个值,
   }

  //查询数据1
   /*
    * 通过query实现查询的

 public Cursor query(String table, String[] columns, String selection, String[]   selectionArgs,
  String groupBy, String having, String orderBy, String limit)

         各参数说明:

     table:表名称
     colums:列名称数组
     selection:条件子句,相当于where   举例 "name=?"
     selectionArgs:条件语句的参数数组  举例 new String[]{ "dmk"}
     groupBy:分组
     having:分组条件
     orderBy:排序类
     limit:分页查询的限制
     Cursor:返回值,相当于结果集ResultSet

    */
   public void query(View view){
        Cursor cs= db.query( "personData", null, null, null, null, null, null);
        if(cs.moveToNext()){
              for( int i=0;i<cs.getCount();i++){
                   cs.move(i);
                   String name=cs.getString(cs.getColumnIndex("name" ));
                   int age=cs.getInt(cs.getColumnIndex( "age"));
                   System. out.println(name+ ":"+age);
                   System.out.println(cs.getColumnIndex("name" ));
                   System. out.println(cs.getColumnIndex( "age"));
                   System. out.println(cs.getColumnCount());
              }
        }

   }
  //数据查询2
   //通过rawQuery实现的带参数查询
   /*
   Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
   if(cursor.moveToFirst()) {
   String password = c.getString(c.getColumnIndex("password"));
   */
   public void rawquery(View view){
        Cursor c= db.rawQuery( "select * from personData where name=?", new String[]{"dmj"});
        if(c.moveToNext()){
             int age=c.getInt(c.getColumnIndex( "age"));
              System. out.println(age);
        }
   }
}

3.3DatabaseHelpter类的代码如下:

<pre name="code" class="java"><pre name="code" class="java">package com.example.contentvaluespractice;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "person.db"; //数据库名称
    private static final int version = 1; //数据库版本

    public DatabaseHelper (Context context) {
        super(context, DB_NAME, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) { //此方法只有在调用getWritableDatabase()或getReadableDatabase()方法时才会执行
        String sql = "create table personData("+
                 "id        integer primary key," +
                 "name      varchar(20) not null," +
                 "age       Integer," +
                 "birthday date)";
        db.execSQL(sql);
    }
    //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("。。。。。。。。");
    }
}


4.针对游标的方法

方法名称 方法描述
getCount() 总记录条数
isFirst() 判断是否第一条记录
isLast() 判断是否最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定的记录
moveToNext() 移动到吓一条记录
moveToPrevious() 移动到上一条记录
getColumnIndex(String columnName) 获得指定列索引的int类型值

5 使用Contenvalues 注意事项

insert的一种构造方法

public long insert (String table, String nullColumnHack, ContentValues values)

table

要插入数据的表的名称

values

ContentValues对象,类似一个map通过键值对的形式存储值。

nullColumnHack

当values参数为空或者里面没有内容的时候,insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。通过观察源码的insertWithOnConflict方法可以看到当ContentValues类型的数据initialValues为null或size<=0时,就会在sql语句中添加nullColumnHack的设置。

若不添加nullColumnHack则sql语句最终的结果将会类似insert into tableName()values(NULL);这是不允许的。

若添加上nullColumnHack则sql语句将会变成insert into tableName (nullColumnHack)values(null);这是可以的。

时间: 2024-10-02 23:55:52

SQLiteDatabase数据库操作详解的相关文章

Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 &#39;AR模式&#39;]

public function getMinLimit () {        $sql = "...";        $result = yii::app()->db->createCommand($sql);        $query = $result->queryAll();         return array (                $query [0] ['max'],         );    } $connection=Yii::

windows phone 8.1开发SQlite数据库操作详解

原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本站广告支持小梦,谢谢!) 建立数据库 增加数据 删除数据 更改数据 查询数据 (注:为了让每个操作都能及时显示在UI上,所以进行了数据绑定.数据绑定会在后面文章专门讲解,先给出数据类Note,代表一个笔记.含有Name 和content  属性.其代码如下:如果不清楚,我会在之后讲解): names

android 数据库操作详解

请看郭大神的八篇专栏,包含sql语句  android封装的databasehelper 和郭大神自己的LitePal  三种使用详解 http://blog.csdn.net/column/details/android-database-pro.html

JMeter数据库操作详解

Jmeter提供了JDBC连接的插件,通过执行SQL语句的java API,实现对数据库的访问和查询. 一.安装驱动包 将需要连接JDBC的jar包放入jmeter安装文件的lib文件中(也可测试计划中的导入) 二.配置JDBC Connection configuration 右键线程组→添加→配置元件→JDBC Connection configuration Variable Name:数据库连接池的名称,在使用JDBC Request时通过该连接池名称进行连接,因此在使用JDBC Req

django 数据库操作详解

你创建完数据模型,django会自动提供给你数据库抽象的API,可以创建,获取,修改,删除对象.本篇文档讲解如何使用API,包括外键相关查询以及多对多模式的操作等 我们参考下面模型,一个weblog: class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __unicode__(self): return self.name class Author(m

DNS基本概念及操作详解----------------转载

DNS基本概念及操作详解 目录: 1.DNS协议 2.DNS查询 2.1递归查询 2.2跌代查询 2.3反向查询 3.域维护 3.1全量AXFR传输 3.2增量IXFR传输 3.3通过NOTIFY 3.4动态更新 4.DNS安全 在很多人看来,DNS只是为外部提供DNS解析服务(我以前也是这么认为的,直到膝盖中了一箭),但作为互联网的基础设施,DNS远没有想象的那么简单.如果你没有听说过DNS查询.反向解析.zone传输.动态更新.DNS安全,那你可以从本文中得到关于他们的最简明的诠释. 一.

Linq实战 之 Linq to Sql及Entity Framework操作详解

Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity framework linq to sql是一个团队 ef 是一个团队... linq to sql => ef 团队. linq to sql 适合一些小型的项目 => sqlserver ef 适合中形的项目,而且可以支持 sqllite,mysql,sqlserver 掌柜的项目开发中:使用的

H2数据库使用 详解

H2最完整的资料下载地址: http://download.csdn.net/detail/yixiaoping/5956595 H2数据库使用 H2数据库介绍 常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL.其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的客户端和服务器端.H2的优势:1.h2采用纯Java编写,因此不受平台的限制.2.h2只有一个jar文件,十分适合作为嵌入式数据库试用.3.性能和功能的优势 H2

如何查看mysql数据库的引擎/MySQL数据库引擎详解

一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show variables like '%storage_engine%'; 你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):mysql> show create table 表名; MySQL数据库引擎详解 作为Java程序员,MySQL数据库