数据储存---SQLtie

来源:互联网 发布:java贪吃蛇游戏设计 编辑:程序博客网 时间:2024/06/05 16:58

SQLite主要特点:

  1. 轻量级:一个动态库,单文件
  2. 独立性:没有依赖,无需安装
  3. 隔离性:全部在一个文件夹中
  4. 跨平台:支持众多操作系统
  5. 多语言接口,支持众多编程语言
关于事务处理的安全性问题:
  • 通过数据库上的独占性和共享锁来实现独立业务处理
  • 多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。
关于SQLite的数据类型:
    据SQLtie支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串值)和BLOB(二进制对象)数据类型。
动态数据类型(弱引用):
    当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型储存。
SQLiteDatabase:
  • 提供了一些管理SQLite数据库的类
  • 提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法
  • 每个程序的数据库名字是唯一的
SQLiteDatabase的一些常用方法:
  • void/execSQL(String sql)     <Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.>{SQLExceptionif the SQL string is invalid}
  • void/insert(Sring table,String nullColumnHack,ContentValues values)      <method for inserting a row into the database>
  • int/delete(String table,String whereClause,String[]whereArgs)                   <method for deleting rows in the database.>
  • int/update(String table,ContentValuese values,String whereClause,String[] whereArgs)       <method for updating rows in the database.>
  • Cursor/rawQuery(String sql,String[] selctionArgs)   <Runs the provided SQL and returns a Cursor over the result set.>
  • Cursor/query(String table,String[]columns,String selection,String[]selectionArgs,String groupBy,String having,String oderBy)<Query the given table ,returning a Cursor over the result set.>
<编写SQLite语句操作数据库>:
创建数据库并打开:static SQLiteDatabase/openOrCreateDatabase(name,mode,factory)
SQLiteDatabase database = openOrCreateDatabase("ice.database",MODE_PRIVATE,null);
在数据库中建立一张名为userInfo的表:
database.execSQL("creat table if not exists userInfo(_id integer primary key autoincreament ,name text not null,age integer not null , sex text not null,salary integer not null)" );
这里userInfo设置为一个主键,四个字段。_id主键自增其中主键前加”_“下划线是为了方便显示到ListView时用适配器SimpCursorAdapter查询(SimpelCursorAdapter只识别主键为下划线的字段名)
添加内容:
db.execSQL("insert into userInfo(name,age,sex,salary)values('Tom',24,'male',6500)");
TIPS:
   Cursor是Android查询数据后的到的一个管理数据集合的类,Cursor的数据量较大时通常手动将Cursor 关闭掉。
  • Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等,常用方法:
  • getCount()                                                            总记录条数
  • isFirst()                                                                 判断是否第一条记录
  • isLast()                                                                 判断是否最后一条记录
  • moveToFirst()                                                       移动到第一条记录
  • moveToLast()                                                       移动到最后一条记录
  • move(int offset)                                                     移动到指定记录
  • moveToNext()                                                       移动到下一条记录
  • moveToPrevious()                                                 移动到上一条记录
  • getColumnIndexOrThrow(String columnName)    据列名称获得列索引
  • getInt(int columnIndex)                                          获得指定列索引的int类型值
  • getString(int columnIndex)                                     获得指定列索引的String类型值
查询内容:
db.rawQuery("select *from userInfo",null);
    Cursor c = db.rawQuery("select *from userInfo",null);    if(c!=null){        while(c.moveToNext()){            Log.i("info","_id"+c.getInt(c.getColumnIndex("_id")));            Log.i("info","name"+c.getString(c.getColumnIndex("name")));            Log.i("info","age"+c.getInt(c.getColumnIndex("age")));            Log.i("info","sex"+c.getString(c.getColumnIndex("sex")));            Log.i("info","salary"+c.getInt(c.getColumnIndex("salary")));            Log.i("info","*******************");        }        c.close();    }    db.close();}
demo1:
public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //每个程序都有自己的数据库,默认情况下互不干扰        //创建一个数据库并打开        SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);        db.execSQL("create table if not exists userInfo(_id integer primary key autoincrement ,name text not null,age integer not null,sex text not null,salary integer not null )" );        db.execSQL("insert into userInfo(name,age,sex,salary)values('Tom',24,'male',6500)");        db.execSQL("insert into userInfo(name,age,sex,salary)values('Alice',24,'female',8000)");        db.execSQL("insert into userInfo(name,age,sex,salary)values('Tyson',24,'male',12000)");        Cursor c = db.rawQuery("select *from userInfo",null);        if(c!=null){            while(c.moveToNext()){                Log.i("info","_id"+c.getInt(c.getColumnIndex("_id")));                Log.i("info","name"+c.getString(c.getColumnIndex("name")));                Log.i("info","age"+c.getInt(c.getColumnIndex("age")));                Log.i("info","sex"+c.getString(c.getColumnIndex("sex")));                Log.i("info","salary"+c.getInt(c.getColumnIndex("salary")));                Log.i("info","*******************");            }            c.close();        }        db.close();    }}



<使用内置函数操作数据库>:
   ContentValues:
          此类是用来存储一组可以被ContentResolver处理的值。
  • ContentValues values  = new ContentValues();
  • values.put("name","Tom");
  • 执行对应的Sql操作
前面操作同使用SQLtie语句操作数据库。
添加内容:
ContentValues values = new  ContentValues();values.put("name","Tom");values.put("age",18);values.put("sex","male");db.insert("nameInfo",null,values);values.clear();

values.put("name","Alice");values.put("age",24);values.put("sex","female");db.insert("nameInfo",null,values);
更改内容:
values.put("sex","female");db.update("nameInfo",values,"_id>?",new String[]{"4"});//将id>4的性别改为女

删除内容:
db.delete("nameInfo","name like ?",new String[]{"%m%"});//删除所有名字中带有"m"的人
查询内容:
    Cursor c = db.query("nameInfo",null,"_id>0",new String[]{"0"},null,null,"name");    if (c!=null){        String[] columns = c.getColumnNames();        while (c.moveToNext()){            for(String columnName:columns){                Log.i("info",c.getString(c.getColumnIndex(columnName)));            }        }        c.close();    }    db.close();}

demo2:
package com.example.administrator.sqlitedemo;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        SQLiteDatabase db = openOrCreateDatabase("userInfo",MODE_PRIVATE,null);        db.execSQL("create table if not exists userInfo(_id integer primary key autoincrement,name text not null,age integer not null,s        ContentValues values = new  ContentValues();        values.put("name","Tom");        values.put("age",18);        values.put("sex","male");        db.insert("nameInfo",null,values);        values.clear();        values.put("name","Alice");        values.put("age",24);        values.put("sex","female");        db.insert("nameInfo",null,values);        values.clear();        values.put("name","Tyson");        values.put("age",38);        values.put("sex","male");        db.insert("nameInfo",null,values);        values.clear();        values.put("name","Tim");        values.put("age",16);        values.put("sex","female");        db.insert("nameInfo",null,values);        values.clear();        values.put("name","Holdor");        values.put("age",28);        values.put("sex","male");        db.insert("nameInfo",null,values);        values.put("sex","female");        db.update("nameInfo",values,"_id>?",new String[]{"4"});//将id>4的性别改为女        db.delete("nameInfo","name like ?",new String[]{"%m%"});//删除所有名字中带有"m"的人        Cursor c = db.query("nameInfo",null,"_id>0",new String[]{"0"},null,null,"name");        if (c!=null){            String[] columns = c.getColumnNames();            while (c.moveToNext()){                for(String columnName:columns){                    Log.i("info",c.getString(c.getColumnIndex(columnName)));                }            }            c.close();        }        db.close();    }}

SQLiteOpenHelper:
  SQLiteOpenHelper是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新,一般建立一个类继承它并重写onCreate()将eonUpgrade()方法。
   方法说明:
  onCreate(SQLiteDatabase db)                                                                创建数据库时调用
  onUpgrade(SQLiteDatabase db, int oldVersion,int new version)            版本更新时调用      
  getReadableDatabase()                                                                          创建或打开一个只读数据库
  gerWritableDatabase()                                                                            创建或打开一个读写数据库

  新建一个DBOpenHelper类,继承SQLtieOpenHelper,并重写onCreat(),onUpgrade.并给出构造函数:
public class DBOpenHelper extends SQLiteOpenHelper{    public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {        super(context, name, factory, version, errorHandler);    }    @Override    public void onCreate(SQLiteDatabase db) {        //首次创建数据库时调用,建库、建表的操作可以在此执行    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        //当数据库的版本发生变化时会自动执行    }}
demo3:
DBOpenHelper.java
public class DBOpenHelper extends SQLiteOpenHelper{    public DBOpenHelper(Context context, String name) {        super(context, name, null, 1);    }    public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {        super(context, name, factory, version, errorHandler);    }    @Override    public void onCreate(SQLiteDatabase db) {        //首次创建数据库时调用,建库、建表的操作可以在此执行        db.execSQL("create table if not exists icecold(_id integer primary key autoincrement,name text not null,age integer not null , sex text not null )");        db.execSQL("insert into icecold(name,age,sex) values ('Axe','34','male')");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        //当数据库的版本发生变化时会自动执行    }}

MainActivity.java
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"icecold.db");        //helper.getReadableDatabase();//只能查询不能写入也不能更新        SQLiteDatabase db = helper.getWritableDatabase();        //db.query()        Cursor c  = db.rawQuery("select * from icecold",null);        if (c!=null){            String[] cols = c.getColumnNames();            while (c.moveToNext()){                for(String ColunmName: cols){                    Log.i("info",ColunmName+":"+c.getString(c.getColumnIndex(ColunmName)));                }            }            c.close();        }        db.close();    }}



0 0