• android学习笔记48——SQLite


    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,回收资源。

  • 相关阅读:
    P3386 【模板】二分图最大匹配 题解(匈牙利算法)
    B. Repetitions Decoding 题解(思维+构造)
    D. Big Brush 题解(构造+bfs)
    软件使用 蓝湖的基础使用
    破解版navicate数据库 15版本
    大腕web2.0版
    JPA(JPQL)批量操作的示例及真实执行逻辑
    Java线程池的使用示例及注意事项
    解决docker开启端口映射后,会直接穿透本机防火墙的问题
    PostgreSQL用户访问多个schema及其他常用命令
  • 原文地址:https://www.cnblogs.com/YYkun/p/5959563.html
Copyright © 2020-2023  润新知