android学习笔记48——SQLite

news/2025/2/26 13:39:14

SQLite

SQLite试试一个嵌入式的数据库引擎,专门用于资源有限的设备(如手机、PDA)上适量数据存取。

SQLite支持绝大部分SQL92语法,同样允许开发者使用SQL语句操作数据库中的数据,但SQLite并不像Oracle、MySQL数据库需要安装、启动服务进程,SQLite数据库只是一个文件。

从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作。

 

SQLiteDatebase

Android提供了SQLiteDatabase代表一个数据库(底层就是一个数据库文件),一旦应用程序获得了代表指定数据库SQLiteDatabase对象,就可通过SQLiteDatabase对象来管理、操作数据库了。

SQLiteDatebase提供如下静态方法来打开一个文件对应的数据库

1.static SQLiteDatebase openDatabase(String path,SQLiteDatebase.CursorFactory factory,int flags)——打开path文件所代表的SQLite数据库

2.static SQLiteDatebase openOrCreateDatabase(File file,SQLiteDatebase.CursorFactory factory)——打开或创建file文件所代表的SQLite数据库

3.static SQLiteDatebase openOrCreateDatabase(String path,SQLiteDatebase.CursorFactory factory)——打开或创建path文件所代表的SQLite数据库

在程序中获取SQLiteDatebase对象后,即可调用SQLiteDatebase的如下方法来操作数据库

execSQL(String sql,Object[] bindArgs)执行带占位符的SQL语句
execSQL(String sql)执行SQL语句
insert(String table,String nullColumnHack,ContentValues values)向执行表中插入数据
update(String table,ContentValues values,String whereClause,String[] whereArgs)更新指定表中的特定数据
delete(String table,String whereClause,String[] whereArgs)删除指定表中的特定数据

Cursor query(String table,String[] columns,String selection,String[] selectonArgs,

String groupby,String having,String orderby)

对执行数据表执行排序

Cursor query(String table,String[] columns,String selection,String[] selectonArgs,

String groupby,String having,String orderby,String limit)

对执行数据表执行查询。limit参数控制最多查询记录数量

(用于控制分页的参数)

Cursor query(boolean distinct,String table,String[] columns,String selection,String[] selectonArgs,String groupby,String having,String orderby,String limit)

对指定表执行查询操作,第一个参数控制是否去除重复值
rawQuery(String sql,String[] selectionAgrs)执行带占位符的SQL语句
beginTransaction开始事务
endTransaction  结束事务

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

以上查询方法都是返回一个Cursor对象,Android中的Cursor类似于JDBC的ResultSet,Cursor同样提供了对应的方法来移动查询结果的记录指针,如下所示:

move(int offset)将记录指针向上/下移动指定的行数,offset为正数就是向下移动,为负数就是向上移动
boolean moveToFirst()将记录指针移动到第一行,如果移动成功返回true
boolean moveToLast()将记录指针移动到最后一行,如果移动成功返回true
boolean moveToNext()将记录指针移动到下一行,如果移动成功返回true
boolean moveToPisition(int position)将记录指针移动到指定的行,如果移动成功返回true
boolean moveToPrevious()将记录指针移动到上一行,如果移动成功返回true

 

 

 

 

 

 

一旦将记录指针移动的指定行之后,就可以调用Cursor的getXxx()方法获取该行的指定列的数据。

 

创建数据库和表

SQLiteDatebase可使用静态方法打开或创建数据库如下:

SQLiteDatebase.openOrCreateDatebase("/mnt/db/temp.db3",null);

——没有指定SQLiteDatebase.CursorFactory factory,该参数是一个用于返回Cursor工厂,如果指定该参数为null,则意味着使用默认的工厂。

注意:

SQLiteDatebase.openOrCreateDatebase("/mnt/db/temp.db3",null);可返回一个SQLiteDatebase对象,

该对象的execSQL可执行任意的SQL语句,因此程序可通过如下代码创建数据库表:

sql="create table userInfo (id integer primary key,name varchar(50))";

db.execSQL(sql);

 

使用SQL语句操作SQLite数据库

如以上所提,SQLiteDatebase的execSQL方法可执行任意SQL语句,包括带占位符的SQL语句。

但由于该方法没有返回值,一般用于执行DDL语句或DML语句,如果需要执行查询语句,则可调用SQLiteDatebase的rawQuery(String sql,String[] selecttionArgs)方法.

Eg:如下代码可执行DML语句:

db.execSQL("insert into tableInfo values(null,?,?)",new String[]{title,content});

sql组成:

  DDL:数据库模式定义语言,关键字:create

  DML:数据操纵语言,关键字:Insert、delete、update

  DCL:数据库控制语言 ,关键字:grant、remove

  DQL:数据库查询语言,关键字:select

实例如下:

布局文件==》main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="110" />

    <EditText
        android:id="@+id/editTwo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="119" />

    <Button
        android:id="@+id/btnInsert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="insert" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
</LinearLayout>

==>line.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
        <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

实现代码
package com.example.mysqlite1;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity
{
    EditText Edit1;
    EditText Edit2;
    SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String filePath = this.getFilesDir().toString() + "my.db3";
        db = SQLiteDatabase.openOrCreateDatabase(filePath, null);
        Edit1 = (EditText) this.findViewById(R.id.editOne);
        Edit2 = (EditText) this.findViewById(R.id.editTwo);

        Button btnInsert = (Button) this.findViewById(R.id.btnInsert);

        btnInsert.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    InsertDataAndInflateList();
                } catch (Exception e)
                {
                    Log.i("swg", "error" + e.getMessage());
                    db.execSQL("create table SQLiteTest2(_id integer primary key autoincrement,text1 varchar(50),text2 varchar(50))");
                    InsertDataAndInflateList();
                }

            }

            private void InsertDataAndInflateList()
            {
                insertData(db, Edit1.getText().toString(), Edit2.getText().toString());
                Cursor crusor = db.rawQuery("select * from SQLiteTest2", null);
                Log.i("swg", "查询完成");
                inflateList(crusor);
            }

            private void insertData(SQLiteDatabase db, String text, String text2)
            {
                db.execSQL("insert into SQLiteTest2 values(null,?,?)", new String[] { text, text2 });
                Log.i("swg", "插入成功");
            }

            @SuppressWarnings("deprecation")
            private void inflateList(Cursor crusor)
            {
                Log.i("swg", "inflateList");
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this,
                        R.layout.line, crusor, new String[] { "text1", "text2" }, new int[] {
                                R.id.tv1, R.id.tv2 });

                Log.i("swg", "inflateList==" + adapter.getCount());

                ListView lv = (ListView) findViewById(R.id.lv);
                lv.setAdapter(adapter);
            }
        });
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        // 退出时关闭SQLiteDatabase
        if (db != null && db.isOpen())
            db.close();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

运行效果;

 

注意:使用SimpleCursorAdapter封装Cursor时要求底层数据表中的主键列的列名为_id,SimpleCursorAdapter只能识别列名为_id的主键。

因此以上实例中创建表时,主键列名为_id.否则就会出现java.lang.IllegalArgumentException:column '_id' does not exist异常。

总结:

使用SQLiteDatabase进行数据库操作的步骤如下:

1.获取SQLiteDatabase对象,其代表了与数据库的连接;

2.调用SQLiteDatabase的方法执行SQL语句;

3.操作SQL语句的执行结果,例如:用SimpleCursorAdapter封装Cursor;

4.管理SQLiteDatabase,回收资源。

 

转载于:https://www.cnblogs.com/YYkun/p/5959563.html


http://www.niftyadmin.cn/n/1808698.html

相关文章

python 编辑器:Ulipad

项目地址&#xff1a;http://code.google.com/p/ulipad/ 查看大图 > 这里不是官方介绍&#xff0c;只是用户的使用感受 代码高亮&#xff0c;可以自定义修改 目录树&#xff0c;文件管理 类浏览 代码自动提示 需要 python wxpython 支持。基本的使用需求满足了吗&#xff…

关于16年2月14日以后上传AppStore出现:Missing iOS Distribution signing identity for...的问题...

2016年2月14日以后打包上传AppStore会发现出现如下的问题&#xff1a; 导致问题的原因是&#xff1a;下边这个证书过期了 以下是苹果官方给出的回应&#xff1a; Thanks for bringing this to the attention of the community and apologies for the issues you’ve been havin…

(十)反射

能够分析类能力的程序称为反射。 Class类 程序运行中&#xff0c;系统为每个对象维护一个运行时的类标识&#xff0c;该信息可以追踪对象所属的类。可以通过专门的java类访问这些信息&#xff0c;保存这些信息的类称为Class类。 获取类型标识&#xff1a; Employee e; Class c1…

李义山诗

1. 平生风义兼师友 哭刘蕡平生风义兼师友&#xff0c;不敢同君哭寝门。2. 乐游原 向晚意不适&#xff0c;驱车登古原。夕阳无限好&#xff0c;只是近黄昏&#xff1b;转载于:https://www.cnblogs.com/mtcnn/p/9422410.html

java token接口设计_橙果科技:Java Web后端注册接口的设计

原标题&#xff1a;橙果科技&#xff1a;Java Web后端注册接口的设计一、 逻辑规划:先规划一下注册的接口&#xff0c;规划接口&#xff0c;当然就是要先考虑需求完结样的功用。客户端注册时&#xff0c;需求将获取的用户名和暗码以及昵称经过post方法来交给服务器&#xff0c;…

网站截图抓取工具:ubuntu+xvfb+CutyCapt,可以实现高效网页缩略图,支持flash显示

找了几个工具都不是很理想&#xff0c;最后通过实验大功告成&#xff0c;下面是具体步骤&#xff1a; 1、环境搭建&#xff1a; 操作系统:ubuntu sudo ap-get install build-essential sudo apt-get install xvfb sudo apt-get install xfs xfonts-scalable xfonts-100dpi su…

看远处的风景和天空的时候难以张开眼睛是为什么?

用眼疲劳 对于程序员来说用眼过度&#xff0c;经常性眼疲劳&#xff0c;会造成用眼负担&#xff0c;要适当的放松眼睛&#xff0c;放松瞳孔。 我有的时候总会有以下疑问 看远处的风景和天空的时候难以张开眼睛是为什么&#xff1f; 视力不好时强行去看&#xff0c;超出了眼睛的…

编辑JS和HTML,CSS的利器:Sublime Text 2.0.1 简体中文版

Sublime Text 是一个代码编辑器&#xff08;Sublime Text 2是收费软件&#xff0c;但目前可以无限期试用&#xff09;也是HTML和散文先进的文本编辑器。漂亮的用户界面和非凡的功能&#xff0c;例如迷你地图&#xff0c;多选择&#xff0c;Python的插件&#xff0c;代码段&…