第十二章:Android数据存储(上)

一、SQLite介绍

提到数据存储问题,数据库是不得不提的。数据库是用来存储关系型数据的不二利器。Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用。Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite。在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内。从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行SQL语句,并通过JNI向上暴露Java可访问的接口。

SQLite可视化工具:SQLite Expert Professional 3;

二、Android访问SQLite

主要步骤:

(1)创建某个类继承SQLiteOpenHelper,并重写

-- 带Context参数的构造函数; //用来创建数据库

-- onCreate(SQLiteDatabase db); //在创建数据库时调用

-- onUpgrade(SQLiteDatabase db,int old,int newversion);  //数据库版本更改时调用

(2)创建数据库:SQLiteDatabase db = helper.getWritableDatabase();

(3)SQL语句:db.execSQL(String sql);

语句使用:

1.打开数据库

SQLiteDatabase db = helper.getWritableDatabase();

SQLiteDatabase db = helper.getReadableDatabase(); //此函数内部其实也调用了getWritableDatabase()函数,即调用了此函数,也可以写数据

2.insert语句

(1)db.execSQL("insert into person(name,age) values(?,?)",new Object[]{"xiazdong",20});

(2)

ContentValues values = new ContentValues();
values.put("name","xiazdong");
values.put("age",20);
db.insert("tablename",null,values);

3.delete语句

(1)db.execSQL("delete from person where id=?",new Object[]{id});

(2)db.delete("tablename","id=?",new String[]{id+""});

4.update语句

(1)

db.exeSQL("update person set age=? where name=?",new Object[]{30,"xiazdong"});

(2)

ContentValues values = new ContentValues();
values.put("age",30);/*set子句*/
db.update("tablename",values,"name=?"/*where子句*/,new String[]{"xiazdong"}/*where子句参数*/);

5.query语句

(1)

Cursor cursor = db.rawQuery("select * from person where name=?",new Object[]{"xiazdong"});
while(cursor.moveToNext()){
    //int index = cursor.getColumnIndex(String name);//根据name获得索引
    //String name = cursor.getString(int index);    //根据索引获得值
    String name = cursor.getString(cursor.getColumnIndex("name"));
}

(2)

Cursor cursor = db.query("tablename",null/*表示select * */,"name=?"/*where语句*/,new String[]{"xiazdong"},null/*group by 语句*/,null/*having 语句*/,null/*order by语句*/,null/*limit 语句*/);

6.分页语句

Cursor cursor = db.rawQuery("select * from person limit ?,?",new Object[]{5,5});    //第一个5表示跳过5条记录,下一个5为查询结果的记录个数

while(cursor.moveToNext()){

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

}

7.获得记录个数语句

(1)

Cursor cursor = db.rawQuery("select count(*) from person", null);
cursor.moveToFirst();
int count = cursor.getInt(0);

(2)

db.query("person",new String[]{"count(*)"},null,null,null,null,null,null);

示例代码:

MySQLiteOpenHelper.java:

package com.example.helloandroid;

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

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    public MySQLiteOpenHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

DataBaseActivity.java

package com.example.helloandroid;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class DataBaseActivity extends Activity {
      private Button createDatabase, createTable, selectData, insertData,
      updateData, deleteDaata;
      private MySQLiteOpenHelper helper;

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

        // 初始化按钮
        createDatabase = (Button) findViewById(R.id.createDatabase);
        createTable = (Button) findViewById(R.id.createTable);
        selectData = (Button) findViewById(R.id.selectData);
        insertData = (Button) findViewById(R.id.insertData);
        updateData = (Button) findViewById(R.id.updateData);
        deleteDaata = (Button) findViewById(R.id.deleteDaata);

        helper = new MySQLiteOpenHelper(DataBaseActivity.this, "mydb.db",
                null, 1);

        /*
         * 创建数据库
         */
        createDatabase.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
                Toast.makeText(DataBaseActivity.this, "数据库创建成功", 1000).show();

            }

        });

        /*
         * 创建表
         */
        createTable.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
                // 创建表
                sqlitedatabase
                        .execSQL("create table student(id INTEGER PRIMARY KEY autoincrement,name text)");
                Toast.makeText(DataBaseActivity.this, "表创建成功", 1000).show();
            }
        });

        /*
         * 插入数据
         */

        insertData.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
                sqlitedatabase
                        .execSQL("insert into student(name) values (‘tinyphp‘)");
                Toast.makeText(DataBaseActivity.this, "插入数据成功", 1000).show();
            }
        });

        /*
         * 更新数据
         */
        updateData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
                sqlitedatabase
                        .execSQL("update student set name=‘monkey‘ where id=‘1‘");
                Toast.makeText(DataBaseActivity.this, "数据更新成功", 1000).show();
            }
        });

        /*
         * 查询数据
         */

        selectData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase = helper.getReadableDatabase();

                //参数:表名、查询的列、查询条件、查询参数、查询结果分组、分组结果限制、排序
                Cursor cursor = sqlitedatabase.query("student", new String[] {
                        "id", "name" }, "id=?", new String[] { "1" }, null,
                        null, null);
                String name=null;
                while(cursor.moveToNext()){
                    name =cursor.getString(cursor.getColumnIndex("name"));
                }
                Toast.makeText(DataBaseActivity.this, "查询结果name为:"+name, 1000).show();
            }
        });

        /*
         * 删除数据
         * */

        deleteDaata.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                SQLiteDatabase sqlitedatabase =helper.getWritableDatabase();
                sqlitedatabase.delete("student", "id=?", new String[]{"1"});
                Toast.makeText(DataBaseActivity.this, "数据删除成功", 1000).show();
            }
        });

    }
}

activity_data_base.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="vertical" >

     <Button
        android:id="@+id/createDatabase"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建数据库" />

     <Button
        android:id="@+id/createTable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建表" />

       <Button
        android:id="@+id/insertData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="插入" />

       <Button
        android:id="@+id/updateData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新" />

       <Button
           android:id="@+id/selectData"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="查询" />

        <Button
        android:id="@+id/deleteDaata"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除" />
</LinearLayout>

效果图:

时间: 2024-10-07 22:45:29

第十二章:Android数据存储(上)的相关文章

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

第十二章——SQLServer统计信息(2)——非索引键上统计信息的影响

原文:第十二章--SQLServer统计信息(2)--非索引键上统计信息的影响 前言: 索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引.一般情况下,默认会在创建索引时,索引列上均创建统计信息.但是不代表在非索引键上的统计信息对性能没有用. 如果表上的所有列都有索引,那么将会是数据库负担不起,同时也不是一个好想法,包括谓词中用到的所有列加索引同样也不是好方法.因为索引会带来负载.因为需要空间存放索引,且每个DML语句都会需要更新索引. 一般

C Primer Plus (第五版) 第十二章 存储类、链接和内存管理 编程练习

第十二章 存储类.链接和内存管理 编程练习 1.Q不使用全局变量,重写程序清单13.4 #include <stdio.h>; int critic(int u); int main(void) { int units; printf("How many pounds to a firkin of butter?\n"); scanf_s("%d", &units); while (units != 56) critic(units); prin

第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息

原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条件的语句来创建非聚集索引,过滤掉不需要的数据,降低索引的维护开销和存储空间,提高查询性能. 准备工作: 在AdventureWorks2012上,有一个Production.WorkOrder表,将使用这个表来做演示. 步骤: 1.  创建一个非聚集索引在Production.WorkOrder列:

【Android的从零单排开发日记】之入门篇(七)——Android数据存储(上)

在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Android的数据存储是构建在Linux的文件系统上,它充分利用Linux的账号系统来限定应用对数据的访问,部署了一套安全和灵活并重的数据存储解决方案.Android的文件框架,以及各种数据

Android——数据存储(四种方式之二)读写SD卡

Android--数据存储(四种方式) 1.SharedPrefereces 只能保存一些简单的数轻量级.XML  存储文件名, 数据保存在data/data/basepackage/shared_prefs/myopt.xml中    实例-收藏-记住密码自动登录 //一种轻量级的数据存储方式//通过KEY 存入数据--putxxxx(key,value) 取出数据--getxxxx(key  default) 2.读写SD卡  SD的根目录  适用于数据流读写 实现步骤:加入读写SD卡权限

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

android 数据存储的几种方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理. 对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络.但从开发者的