Android中SQLite数据库的简单使用

File file = new File(“hah.txt”);

//只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在。如果文件不存在,则不会被创建。

必须要有文件输出流对文件进行了写的操作,文件才会被创建。

 

游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的。游标相当于数组的指针,通过游标的上下移动来查找数据。


Android中使用SQLite数据库,需要继承SQLiteOpenHelper,该类没有提供默认的构造函数,所以在子类中必须显示的调用该类的构造函数。

创建数据库

package com.test.sqllitedemo;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

 

public class MyDBOpenHelper extends SQLiteOpenHelper {

    //子类构造函数的参数不一定要和父类构造函数的参数一一对应

    public MyDBOpenHelper(Context context) {

    /**

     * @paramcontext 上下文

     * @paramname  数据库文件的名称

     * @paramfactory 用来创建游标对象,null就用默认的游标工厂

     * @paramversion 数据库的版本 号,从1开始。用来更新数据库。

     * 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

     */

        super(context, "test.db"null,1);

}

 

    @Override

    //数据库第一次创建的时候自动执行

    public void onCreate(SQLiteDatabase db) {

}

 

@Override

    //数据库版本更新时自动执行

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

        // TODO Auto-generated method stub

    }

 

}

创建数据库

package com.test.sqllitedemo;

 

import android.app.Activity;

import android.os.Bundle;

 

public class MainActivity extends Activity {

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //执行该行代码,数据库不会被创建,只是创建了一个数据库对象

        MyDBOpenHelper helper = new MyDBOpenHelper(this);

        //创建或者打开一个数据库,该数据库具有读写权限,位于data/data/应用程序包名/databases   /文件夹下面

        helper.getWritableDatabase();

    }

 

}

 

SQLite中创建表

SQLite中所有数据类型默认存储都是字符串类型的,没有长度限制的。超过表定义时的数据长度,也不会报错。

AndroidSQLite会自动创建一张名为android_metadata的表。用于存储当前的语言环境的。在SQLiteid推荐使用_id

SQLite的数据库版本只能增大,不能减小。

package com.test.sqllitedemo;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

 

public class MyDBOpenHelper extends SQLiteOpenHelper {

//子类构造函数的参数不一定要和父类构造函数的参数一一对应

    public MyDBOpenHelper(Context context) {

    /**

     * @paramcontext 上下文

     * @paramname  数据库文件的名称

     * @paramfactory 用来创建游标对象,null就用默认的游标工厂

     * @paramversion 数据库的版本 号,从1开始。用来更新数据库。

     * 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

     */

    super(context, "test.db"null,1);

}

 

    @Override

    //数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法

    /**

     * 该方法中创建表结构,初始化数据库

     * @param db 代表的是创建好的数据库

     */

    public void onCreate(SQLiteDatabase db) {

        // TODO Auto-generated method stub

        //执行SQL语句

            db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20))");

    }

 

    @Override

    //数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小

    //int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据

    //如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据

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

        // TODO Auto-generated method stub

            db.execSQL("alter table info add money varchar(10)");

    }

}

 

EL表达式只能在jsp页面中使用。

 

数据库的增删改查。

<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="com.test.databaseoper.MainActivity" >

    <Button

        android:onClick="add"

        android:layout_width="wrap_content"

        android:layout_height="match_parent"

        android:text="add" />

    <Button

        android:onClick="update"

        android:layout_width="wrap_content"

        android:layout_height="match_parent"

        android:text="update" />

    <Button

        android:onClick="delete"

        android:layout_width="wrap_content"

        android:layout_height="match_parent"

        android:text="delete" />

    <Button

        android:onClick="query"

        android:layout_width="wrap_content"

        android:layout_height="match_parent"

        android:text="query" />

 

</LinearLayout>

 

package com.test.databaseoper;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

 

public class MyDBOpenHelper extends SQLiteOpenHelper {

    //子类构造函数的参数不一定要和父类构造函数的参数一一对应

    public MyDBOpenHelper(Context context) {

        /**

         * @param context 上下文

         * @param name  数据库文件的名称

         * @param factory 用来创建游标对象,null就用默认的游标工厂

         * @param version 数据库的版本 号,从1开始。用来更新数据库。

         * 数据库后缀名不是固定的,写为.db只是为了方便查看和识别

         */

        super(context, "test.db", null,1);

}

 

@Override

//数据库第一次创建的时候自动执行,如果数据库已经存在,则不会再次调用该方法

    /**

     * 该方法中创建表结构,初始化数据库

     * @param db 代表的是创建好的数据库

     */

    public void onCreate(SQLiteDatabase db) {

    // TODO Auto-generated method stub

    //执行SQL语句

        db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varch        ar(20))");

}

 

    @Override

//数据库版本更新时自动执行,即数据库版本号有变化的时候执行 数据库的版本只能变大,不能变小

//int oldVersion, int newVersion用来完成跨版本升级数据库时保持数据

//如果是垄断性行业,数据是一次有效的情况下,可以强制以前数据失效的方式升级,让用户重新输入数据

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

        // TODO Auto-generated method stub

        db.execSQL("alter table info add money varchar(10)");

}

 

}

 

 

package com.test.databaseoper;

 

import java.util.Random;

 

import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

import android.view.View;

 

public class MainActivity extends Activity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

}

public void add(View view){

//创建数据库

        MyDBOpenHelper helper = new MyDBOpenHelper(this);

        SQLiteDatabase db = helper.getWritableDatabase();

        Random random = new Random();

        String sql = "insert into info(name,phone)values(?,?)";

        //SQLite中,也可以使用占位符来传递参数

        db.execSQL(sql, new Object[]{"lisi"+random.nextInt(100),"453231"});

        //释放资源

        db.close();

}

public void delete(View view){

}

public void update(View view){

}

public void query(View view){

        MyDBOpenHelper helper = new MyDBOpenHelper(this);

        SQLiteDatabase db = helper.getWritableDatabase();

        String sql = "select * from info";

        Cursor cursor = db.rawQuery(sql, null);

        while (cursor.moveToNext()) {

                String id = cursor.getString(0);

                String name = cursor.getString(1);

                String phone = cursor.getString(2);

                System.out.println(id+"  "+name+"  "+phone);

        }

    //释放资源

        cursor.close();

        db.close();

    }

}

 

SQLite中,所有的数据都是当做字符串存的。

Android数据库中支持中文显示

 

查看SQLite中表中的数据的三种方式

1.写sql语句把数据查出,显示在logcat中查看

2.在应用程序独立数据区,把数据库pull出来,然后再可是话工具中查看

3.在命令行查看SQLite数据库中表中的数据

 

更改命令行默认的编码集

    chcpchange current page) 65001utf-8的编码值)


插入重复数据时,应该提示用户是否覆盖已有的数据。

删除数据时,应该提示用户是否确定删除。

 

程序的设计应该有良好的提示和操作方式。

 

查询操作不会更改数据库中的内容。一般获取可读的数据库。

多线程写数据库,必须明确写入的先后顺序。以及加锁。

读的操作可以多线程并发操作,写数据库的操作必须枷锁。

 

googleAndroidapi对数据库的增删改查

package com.test.databaseoper;

 

import java.util.Random;

 

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.Toast;

 

public class GoogleDataBaseOPR extends Activity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

}

 

public void add(View view) {

    // 创建数据库

    MyDBOpenHelper helper = new MyDBOpenHelper(this);

    SQLiteDatabase db = helper.getWritableDatabase();

    Random random = new Random();

    ContentValues values = new ContentValues();

    values.put("name", "lisi" + random.nextInt(100));

    values.put("phone", "12345678");

/*

 * db.insert(table, nullColumnHack, values)

 * 第一个参数:表名

 * 第二个参数:要填充空值的列

 * 第三个参数:插入的值  map集合,ContentValues

 */

    long id = db.insert("info", null, values);

    if (id != -1) {

        Toast.makeText(this, "添加成功,添加在" + id + "", Toast.LENGTH_SHORT)

        .show();

        } else {

            Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();

        }

        // 释放资源

    db.close();

}

 

public void delete(View view) {

    MyDBOpenHelper helper = new MyDBOpenHelper(this);

    SQLiteDatabase db = helper.getWritableDatabase();

/*

 * db.delete(table, whereClause, whereArgs)

 * 第一个参数:表名

 * 第二个参数:选择条件

 * 第三个参数:选择条件的参数

 * 返回值:删除的行数,如果没有删除,返回0

 */

    int result = db.delete("info", null, null);

    db.close();

    if (result != 0) {

        Toast.makeText(this, "删除"+ result + "", Toast.LENGTH_SHORT)

        .show();

        } else {

            Toast.makeText(this, "删除失败" , Toast.LENGTH_SHORT).show();

    }

}

 

public void update(View view) {

    MyDBOpenHelper helper = new MyDBOpenHelper(this);

    SQLiteDatabase db = helper.getWritableDatabase();

/*

 * db.update(table, values, whereClause, whereArgs)

 * 第一个参数:表名

 * 第二个参数:插入的值

 * 第三个参数:选择条件,没有选择条件时填null

 * 第四个参数:选择条件的参数 没有参数时填null

 * 返回值:修改的行数,如果没有修改,返回0

 */

    ContentValues values = new ContentValues();

    values.put("name", "lisi");

    values.put("phone", "12345678");

    int result = db.update("info", values, null, null);

    if (result != 0) {

        Toast.makeText(this, "修改了第"+ result + "", Toast.LENGTH_SHORT)

        .show();

        } else {

            Toast.makeText(this, "修改失败" , Toast.LENGTH_SHORT).show();
     
}

}

 

public void query(View view) {

    MyDBOpenHelper helper = new MyDBOpenHelper(this);

    SQLiteDatabase db = helper.getWritableDatabase();

/*

 * db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)

 * 第一个参数:表名

 * 第二个参数:返回的列  null表示返回所有列

 * 第三个参数:选择条件,没有选择条件写null

 * 第四个参数:选择条件的参数,没有选择条件参数写null

 * 第五个参数:分组条件,没有写null

 * 第六个参数:分组条件,没有写null

 * 第七个参数:分组条件,没有写null

 * 返回值:查询结果的记录的条数

 */

    //Cursor cursor = db.query("info", null, null, null,null,null,null);

    Cursorcursor=db.query("info",newString[]{"_id","name","phone"},null,null,null,null,null);

    while (cursor.moveToNext()) {

            String id = cursor.getString(0);

        String name = cursor.getString(1);

        String phone = cursor.getString(2);

        System.out.println(id+"  "+name+"  "+phone);

    }

    //释放资源

    cursor.close();

    db.close();

    db.close();

    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章