Android 学习笔记之如何使用SQLite数据库来保存数据...

PS:最近一阵子都在为考试复习...坑爹的计算机网络,复习了3天,最后该不会的还是不会...明天还考英语...真蛋疼...

学习内容:

1.使用SQLite数据库来保存数据...

SQLite:

  SQLite一个轻量级的数据库,数据库这东西就是为了保存大量数据而存在的一个工具,SQLite支持SQL语言,其实和Mysql差不多,语句基本都是一样的,增删改查也非常的方便...SQLite独立性非常的好,使用SQLite不需要安装...不依赖与任何的引擎就可以独立的去执行...感觉这一点还是非常强悍的...安全性也比较好...

  Android集成了SQLite数据库,因此每个Android中直接就可以使用SQLite数据库,通过引用一些必要的包,我们就可以在Android程序中去使用...使用时需要引入这四个包...

  i.android.database.sqlite.SQLiteDataBase      //完成数据增删改查的操作...

  ii.android.database.sqlite.SQLiteOpenHelper   //完成数据库的创建及更新操作...

  iii.android.database.Cursor                    //对查询的结果进行保存...

  iv.android.database.ContentValues              //对传递的数据进行封装...

  引入了这四个包后,我们就可以在Android应用程序当中去使用SQLite了...我直接通过一个例子来说明一下,一个Android中如何使用SQLite,并且数据的信息保存的位置,如何对数据进行增删改查操作...基本的SQL语句也就没必要介绍了,学过数据库的一定知道SQL标准化语句...

  首先我们在使用数据库的时候,我们需要对数据库进行创建...

package com.example.sqlite;

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

public class DataBaseHelp extends SQLiteOpenHelper{

    private static final String DataBaseName="java.db";
    private static final int DataBaseVersion=1;
    private static final String TableName="person";
    public DataBaseHelp(Context context) {
        /**
         * Create a helper object to create, open, and/or manage a database.
         * This method always returns very quickly.  The database is not actually
         * created or opened until one of {@link #getWritableDatabase} or
         * {@link #getReadableDatabase} is called.
         *
         * @param context to use to open or create the database
         * @param name of the database file, or null for an in-memory database
         * @param factory to use for creating cursor objects, or null for the default
         * @param version number of the database (starting at 1); if the database is older,
         *     {@link #onUpgrade} will be used to upgrade the database; if the database is
         *     newer, {@link #onDowngrade} will be used to downgrade the database
         */
        super(context, DataBaseName, null, DataBaseVersion);
        // TODO Auto-generated constructor stub
    }
    //执行数据库的创建操作...
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql="Create table "+TableName+"( id int primary key,name varchar(50) not null,sex varchar(20) not null,DateofBorth date not null,email varchar(50) not null)";
        //书写完的SQL语句,需要使用execSQL(sql)执行...
        db.execSQL(sql);
    }
    //当数据库的版本需要升级的时候调用这个方法...这个方法中可以将数据表进行删除...
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String sql="Drop table if exists"+TableName;
        db.execSQL(sql);
        this.onCreate(db);
    }

}

  在这里我们需要定义一个类去继承SQLiteOpenHelper类,并重写其中的方法,通过这个类来创建数据库对象,继承这个类是必须的,因为这个类是个辅助类,通过这个类我们才能够完成对数据库的操作...为什么?因为这个类中定义了对数据库的创建,更新,规定以什么方式去打开数据库的种种方法,只有通过继承这个类,然后定义对象我们次才能够调用其中的方法来完成对数据库的操作...这就是继承这个类的目的,java中有很多类中都为你写好了实现的方法,我们不需要自己去书写实现过程,只需要继承调用就可以了,这就是java类库的强大之处.

  有了这个类,我们就需要去调用这个类中的方法了....下面就是实现调用的过程...然后通过调用getWritableDataBase方法我们才能够进行相应的操作,当数据库不存在的时候,会调用onCreate()方法去创建一个数据库,这里建立了一个java.db数据库...这个数据库就成功的被建立了...这个数据库的存放位置是模拟器的sd卡中data/data/项目/databases目录下...

package com.example.sqlite;
/* android.database.sqlite.SQLiteDatabase...完成对数据的增删改查...
 * android.database.sqlite.SQLiteOpenHelper...完成数据库的创建及更新操作...
 * android.database.Cursor...在使用查询语句进行数据查询后,保存所有的查询结果...
 * android.database.ContentValues...在对数据库进行操作之前...对传递的数据必须进行封装...
 * Context 识别调用者的实例...
 * Android集成了SQLite数据库...无需进行安装就可以使用...
 * 首先创建数据库:
 *       继承SQLiteOpenHelper类...重写其内部的方法....
 *
 * */
import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity implements View.OnClickListener {

    private DataBaseHelp help;
    private OperatorTable mytable;
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        findViewById(R.id.insert).setOnClickListener(this);
//        findViewById(R.id.drop).setOnClickListener(this);
//        findViewById(R.id.update).setOnClickListener(this);
//        findViewById(R.id.select).setOnClickListener(this);
        help=new DataBaseHelp(this);
        layout=(LinearLayout) findViewById(R.id.layout);
        mytable=new OperatorTable(help.getWritableDatabase());
    }

    @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;
    }
}

  这样完成了数据库的建立是没有什么意思的...我们需要进行增删改查操作...定义了一个类来实现增删改操作...查询操作在下面来完成...

package com.example.sqlite;

import android.database.sqlite.SQLiteDatabase;

public class OperatorTable {

    private SQLiteDatabase db=null;
    public OperatorTable(SQLiteDatabase db){
        this.db=db;
    }
    public void insert(String sql){
        this.db.execSQL(sql);
        this.db.close();
    }
    public void drop(String sql_1){
        this.db.execSQL(sql_1);
        this.db.close();
    }
    public void update(String sql_2){
        this.db.execSQL(sql_2);        this.db.close();
    }
}

  定义了一个查询类...查询类需要使用到Cursor这个接口...通过实现这个接口来完成数据的查询操作,然后把查询后的结果以集合的方式进行返回...通过调用rawquery()方法,去调用另一个 public Cursor rawQueryWithFactory( CursorFactory cursorFactory, String sql, String[] selectionArgs,String editTable) {}方法,然后执行其中的SQL语句,最后使用一个字符串数组将查询的结果按行保存...这里遍历这个Cursor需要使用到下面的三个方法进行遍历..然后我把这个结果保存在了一个List<String>集合中,最后进行返回...

package com.example.sqlite;

import java.util.ArrayList;
import java.util.List;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class SearchTable {

    private String name="person";
    private SQLiteDatabase db;
    public SearchTable(SQLiteDatabase db) {
        // TODO Auto-generated constructor stub
        this.db=db;
    }

    public List<String>find(){
        List<String>all=new ArrayList<String>();
        String sql="select name,sex,email from person";
        Cursor cursor=this.db.rawQuery(sql, null);
        for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
            //使用List保存查询到的数据信息...
            all.add(cursor.getString(0)+" "+cursor.getString(1)+" "+cursor.getString(2));
            System.out.println(cursor.getString(0).toString()+" "+cursor.getString(1).toString()+" "+cursor.getString(2).toString());
        }

        db.close();
        return all;

    }

}

  我把这个结果返回到了一个ListView中,然后显示在屏幕上...这就是最终的主函数...下面有一个地方需要注意..就是使用getWritableDataBase()方法时需要注意的地方...只有在对数据库进行操作的时候,我们才能够使用这个方法来打开数据库...在任何一个模块中都需要使用这个语句,当然也可以定义一个DAO层来实现这个方法,然后调用,但是无论怎样这个方法时随开随用的...无法定义一个全局属性...这是一个需要注意的地方...

package com.example.sqlite;
/* android.database.sqlite.SQLiteDatabase...完成对数据的增删改查...
 * android.database.sqlite.SQLiteOpenHelper...完成数据库的创建及更新操作...
 * android.database.Cursor...在使用查询语句进行数据查询后,保存所有的查询结果...
 * android.database.ContentValues...在对数据库进行操作之前...对传递的数据必须进行封装...
 * Context 识别调用者的实例...
 * Android集成了SQLite数据库...无需进行安装就可以使用...
 * 首先创建数据库:
 *       继承SQLiteOpenHelper类...重写其内部的方法....
 *
 * */
import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity implements View.OnClickListener {

    private DataBaseHelp help;
    private OperatorTable mytable;
    private LinearLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.drop).setOnClickListener(this);
        findViewById(R.id.update).setOnClickListener(this);
        findViewById(R.id.select).setOnClickListener(this);
        help=new DataBaseHelp(this);
        layout=(LinearLayout) findViewById(R.id.layout);
//        mytable=new OperatorTable(help.getWritableDatabase());
    }

    @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;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
//        MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
        switch(v.getId()){
        case R.id.insert:
            /* getWritableDatabase通过写的方式打开数据库...由于每次都对数据库进行关闭操作,因此每次都要执行这个函数来打开数据库...
             * 这句话是无法使用在其他函数当中的,更不能定义为全局变量,原因就是,当我们真正对数据库进行操作的时候,我们才能够使用
             * 这个函数来打开数据库...随开随用...
             * */
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_insert="insert into person values(2,‘c‘,‘f‘,‘1995-01-11‘,‘[email protected]‘)";
            MainActivity.this.mytable.insert(sql_insert);
            break;
        case R.id.drop:
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_drop="delete from person where id=‘2‘";
            MainActivity.this.mytable.drop(sql_drop);
            break;
        case R.id.update:
            MainActivity.this.mytable=new OperatorTable(MainActivity.this.help.getWritableDatabase());
            String sql_update="update person set name=‘android‘ where id=‘1‘";
            MainActivity.this.mytable.update(sql_update);
            break;
        case R.id.select:
//            SearchTable search=new SearchTable(MainActivity.this.help.getWritableDatabase());
            ListView listview=new ListView(MainActivity.this);
            listview.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.activity_list_item,new SearchTable(MainActivity.this.help.getWritableDatabase()).find()));
            MainActivity.this.layout.addView(listview);
//            search.find();
        }
    }

}

  这样就实现了在Android应用程序中使用SQLite,并对其进行增删改查操作...非常的简单..最后推荐给大家一个SQLite Expert Personal是用来可视化SQLite的一个工具,个人感觉还是很好用的...

时间: 2024-10-18 21:18:37

Android 学习笔记之如何使用SQLite数据库来保存数据...的相关文章

Android学习笔记(8)——Sqlite数据库的事务问题

事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 一个浅显的例子,例如银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行.不能说如果执行完一个账号的扣款之后,突然停电了,另外一个账号没有进行增款操作. 类似这样的情况,我们都应该把它们看成一个事务.事务是数据库维护数据一致性的单位,并且在每个事务结束时,都能保持数据一致性. 事务应该遵循ACID特征,即: Atomic(

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

Android学习笔记(十六)——数据库操作(上)

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类我们可以方便地对数据库进行创建和升级.首先,由于SQLiteOpenHelpe是一个抽象类,所以我们需要创建一个类来继承它.SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现

Android学习笔记(43):Java开发SQLite程序

正如前面一文说的,SQLite多用于嵌入式开发中,但有时为了更方便的编辑数据库文件,我们也常常需要开发在电脑上运行的SQLite程序.这种情况是经常发生的,比如在我们需要把一大批的txt文件中的数据插入到一个数据库中的时候. 还好这是很简单的,所以本文我们来学习如何用Java开发SQLite程序. (1)准备工作 下载sqlite-jdbc-版本号.jar文件,放到jre\lib\ext文件夹.如我的路径是C:\Program Files\Java\jre1.8.0_77\lib\ext. (2

Android学习笔记(四一):SQLite的使用

SQLite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite.SQLite提供SQL接口,和一般的数据库一样.但是Android的API不采用JDBC,JDBC消耗太多的资源. SQLite支持绝大部分SQL-92标准,不支持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOI

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android学习笔记(四三):文件访问

之前我们学习了通过preference和SQLite数据库进行数据存储,也可以通过文件方式.文件可以是在应用打包时预置,也可以是应用所生成. 文件访问有两种方式:一:静态数据的文件可以防止在res/raw中,这些文件是只读的,只有在应用版本升级的时候进行修改,或者我们先读出这些数据,通过 reference的方式来处理,这样以后可以进行修订,但是这种方式,会有两份数据保存.二:另一种方式是通过URL访问文件,动态数据的读取也可以采用SQLite3的方式. res/raw/下静态文件的读取 在re