Android:数据存储
一,Sharedpreferences用XML文件来存储 “键-值”格式数据
二,Files通过FileInputStream和FileOutputStream对文件进行操作
三,SQLite标准数据库,支持SQL语句(SQL 92标准)
四,Network通过网络存储和获取数据
Sharedpreferences存储数据
Shared Preferences 类似于winform中做一些小型配置的ini文件,用来保存一些用户设置的参数。例如,可以通过它保存上一次用户所做的修改或者自定义参数设定,当再次启动程序后依然保持原有设置。
Shared Preferences 文件存储的物理位置:打开DDMS界面,File Explorer标签
data\data\你的项目名称\shared_prefs
Shared Preferences提供了getPreferences、getSharedPreferences和PreferenceManager.getDefaultSharedPreferences(context)方法来获得Preferences对象,取得该对象了,即可以使用Editor取得编辑对象。
Editor主要包含一些putXXX方法,支持boolean, float,int, long, and string几种类型,最后完成添加后,一定要调用commit方法进行修改后的提交。
在Android系统提供的API中, 获取Preferences对象有四种文件创建模式,分别如下:
1.Activity.MODE_APPEND如果该文件已经存在,则将数据写入现有文件的末尾。
2.MODE_PRIVATE默认模式,哪个应用程序创建的文件就由哪个应用程序来调用,即为私有的。
3. Activity.MODE_WORLD_READABLE允许所有其他应用程序有读取和创建文件的权限。
4.Activity.MODE_WORLD_WRITEABLE允许所有其他应用程序具有写入、访问和创建的文件权限。
示例代码
import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
public class PrefsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.layout.settings);
}
public static boolean getMusic(Context context)
{
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("music", true);
}
public static boolean getHints(Context context)
{
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("hints", true);
}
}
布局文件settings.xml
<?xml version="1.0"encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="music"
android:title="music_title"
android:summary="music_summary"
android:defaultValue="true"/>
<CheckBoxPreference
android:key="hints"
android:title="hints_title"
android:summary="hints_summary"
android:defaultValue="true"/>
</PreferenceScreen>
Files存储数据
File 就是把需要保存的东西通过文件的形式记录下来,当需要这些数据时,通过读取这个文件来获取这些数据。因为 Android 采用了 Linux 内核,所以在Android 系统中,文件也是Linux 的形式。Android 中可以在自身设备上存储也可以在外接的存储设备中创建保存数据文件。同时,在默认状态下,文件是不能在不同的程序间共享的。
私有文件路径:/data/data/包名/files/
//保存文件
FileOutputStreamoutputStream=context.openFileOutput
(fileName,Context.MODE_PRIVATE);
//读取文件
FileInputStreaminputStream=context.openFileInput(fileName);
在程序中要访问sd卡就要申请sd卡的访问权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
sd卡路径:2.2前 /sdcard,2.2后 /mnt/sdcard
最好获得路径方法:Environment.getExternalStorageDirectory()
将文件写入sdcard的时候要判断用户时候插入sdcard并且可以读写
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
SQLite标准数据库
简介
SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作为 PHP V4.3 中的一个选项引入的,构建在 PHP V5 中。SQLite 支持多数 SQL92 标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。SQLite 还非常健壮。其创建者保守地估计 SQLite 可以处理每天负担多达 100,00 次点击率的 Web 站点,并且 SQLite 有时候可以处理 10 倍于上述数字的负载。
SQLite 对 SQL92 标准的支持包括索引、限制、触发和查看。SQLite 不支持外键限制,但支持原子的、一致的、独立和持久 (ACID) 的事务(后面会提供有关 ACID 的更多信息)。
为什么要进行嵌入?
嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。它们是使用精简代码编写的,对于嵌入式设备,其速度更快,效果更理想。嵌入式运行模式允许嵌入式数据库通过 SQL 来轻松管理应用程序数据,而不依靠原始的文本文件。嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。
要知道,SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器,并且可以实现多数 SQL92 标准(但不是全部)。SQL92 标准的其他一些主要功能是外键和检查限制。了解哪些 SQL92 功能未实现。
这意味着事务是原子的,因为它们要么完全执行,要么根本不执行。事务也是一致的,因为在不一致的状态中,该数据库从未被保留。事务还是独立的,所以,如果在同一时间在同一数据库上有两个执行操作的事务,那么这两个事务是互不干扰的。而且事务是持久性的,所以,该数据库能够在崩溃和断电时幸免于难,不会丢失数据或损坏。
SQLite 通过数据库级上的独占性和共享锁定来实现独立事务处理。这意味着当多个进程和线程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
SQLITE详解
之前讲过在ANDROID应用开发中我们使用SHAREDPREFERENCE与文件操作数据持久访问的问题,今天我就把SQLITE在ANDROID中应用的详细操作也介绍下吧:
在ANDROID应用开发中,我们可能最好奇的就是对数据持久保持的操作是怎么实现的了,GOOGLE采用了最轻便与最灵活的数据访问方式,也就是SQLITE这么一个轻量级的数据持久访问方式,之前的SHAREDPREFERENCES只是对小数据与其参数配置方面所做的要求,以及在本地文件进行存储的方式来访问,但是我们需要像在PC终端使用MYSQL,或者ORACLE之类的来对数据进行管理操作,使用SQLITE是同样可以实现的,如果你之前是做J2EE开发的,你可能对MYSQL,ORACLE之类的数据库操作已经很熟悉了,如果是那样的话,你再来操作SQLITE也就闻文生意了,他们的最大不同点就是一个小得可以直接放进浏览器里进行操作,一个需要在本地非常复杂的安装与配置,然后以服务器的方式进行管理来操作,从这里就可以知道我们在做手机开发时为什么要使用SQLITE数据库了,下面就具体介绍下其操作步骤与可能会遇到的问题:
在我们对其SQLITE数据库初次操作时,我们会调用两个方法,分别是:getReadableDatabase(),getWritableDatabase(),当然在你第一次操作时,首先你创建的操作类肯定要先继承SQLiteOpenHelper这个类,它要求你去实现两个方法,分别是:onCreate(SQLiteDatabase db);onUpgrade(SQLiteDatabaedb,int oledVersion,int newVersion),还有就是你必须要实现一个构造器,即你创建的类为OpenSQLiteDemo类,其构造器:public OpenSQLiteDemo(Context context,String name,CursorcursorFactory,int version){super(context,name,cursorFactory,version);},这样可以构造出一个上下文对象出来,在你操作方法时,可以使用上下文对象来操作,为此我在调用这个构造器会传送一个版本号,通过这个版本号可以去判断,我们到底是调用是否需要去调用onUpgrade()方法来更新数据表的结构。当我们调用SQLiteOpenHelper类中的getWritableDatabase方法时,首先会有一个用来保存数据库对象的上下文来进行判断,即mDatabase!=null与mDatabase.isOpen()与mDatabae.isReadOnly()后,如果数据库已经创建就跳过,否则就直接返回已经创建的mDatabae,当第一次执行是肯定会跳过去创建新库,注意在此期间还有一个步骤就是,它判断在安装初始化为FLASE时抛出非状态异常,可以从源码这句来说明:if(mIsInitializing is false){throw newIllgealStateException("getWritableDtabase called recurisively");},然后我们通过版本号,来判断,版本号时时候等于0,初始默认为0,此时就会调用onCreadte(db)来进行新库创建,这可以根据构造器中你的名称来设置库名,如果已经创建了这个数据库,然而我想对其数据库表结构进行更改时,或者是版本进行更新时,我们可以设置它的版本号不同于之前的版本号即可,一般用数字上浮来设置。这样,我们就可以在onUpgrade()方法里对数据表进行操作,可以对其执行execSQL(sql)方法来执行如对其表增加一列,和删除某列都行,这时,我们在调用SQLiteOpenHelper类的getWritableDatabase方法时就会判断其版本号是否与之前相同,如果不同,就会调用onUpgrade(db,version,mNewVersion)方法来进行更新。OK,这是讲我们创建数据库时的操作,不要忘了,第一次操作,会判断一个方法:openOrCreateDatabase()方法对其数据库创建与否的操作,下面我们就来介绍通过SQLITE来对数据进行CURD的操作,在SQLITE中也有CURD四个操作的方法,只是我们更习惯去使用SQLITE提供的execSQL(代表增加,更新,删除的操作),rawQuery(代表查询)的操作,因为只有两个方法,使用起来方便灵活。
示例代码(继承SQLiteOpenHelper)
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
SQLiteDatabase db=null;
public DatabaseHelper(Context context,String name)
{
this(context,name,VERSION);
}
public DatabaseHelper(Context context,String name,int version)
{
this(context, name,null,version);
}
//在SQLiteOepnHelper的子类当中,必须有该构造函数
public DatabaseHelper(Context context, String name,CursorFactory factory,int version)
{
//必须通过super调用父类当中的构造函数
super(context, name, factory, version);
}
public void createOrDelTable(String sql)
{
db=getReadableDatabase();
db.execSQL(sql);
}
public long insert(String table,String column,ContentValues values)
{
db = getWritableDatabase();
return db.insert(table, column, values);
}
public int update(String table,ContentValues values,Stringwhere,String[] whereArgs)
{
db = getWritableDatabase();
return db.update(table, values, where,whereArgs);
}
public int delete(String table,String whereClause,String[]whereArgs)
{
db = getWritableDatabase();
return db.delete(table, whereClause, whereArgs);
}
public Cursor query(String table,String[] columns,String selection,String[]selectionArgs,String groupBy,String having,String orderBy)
{
db=getReadableDatabase();
return db.query(table, columns, selection, selectionArgs, groupBy,having, orderBy);
}
public void exeecSQL(String sql)
{
db = getWritableDatabase();
db.execSQL(sql);
}
//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
@Override
public void onCreate(SQLiteDatabase db)
{
//execSQL函数用于执行SQL语句
db.execSQL("createtable user(id integer PRIMARY KEY AUTOINCREMENT,name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
Android:ContentProvider
ContentProvider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,ContentProvider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。 ContentProvider 是如何向外界提供数据的?Android提供了ContentProvider,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。
Uri:通用资源标志符(Universal ResourceIdentifier, 简称"URI")。
Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。
URI一般由三部分组成:
访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。
Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选)
举些例子,如:
所有联系人的Uri:content://contacts/people
某个联系人的Uri: content://contacts/people/5
所有图片Uri: content://media/external
某个图片的Uri:content://media/external/images/media/4
Android 系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的 ContentProvider, 这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些ContentProvider。访问这些ContentProvider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对ContentProvider 中的数据进行查询、插入、修改和删除等操作。下面通过一个例子来说明访问ContentProvider的方式,本例中通过ContentResolver对象访问Android中存储了联系人信息的Content Provider并将数据显示到TextView上。
Activity代码
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.database.Cursor;
importandroid.graphics.Color;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.provider.ContactsContract;
importandroid.widget.TextView;
public class Activity01 extendsActivity {
//查询Content Provider时希望返回的列
String [] columns = {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID,
//People._ID,
//People.NAME
};
Uri contactUri =ContactsContract.Contacts.CONTENT_URI;
TextView tv;
//Uri contaUri =Contacts.People.CONTENT_URI;
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView)findViewById(R.id.tv);
String result = getQueryData();
tv.setTextColor(Color.GREEN);
tv.setTextSize(20.0f);
tv.setText("ID\t名字\n" +result);
}
//获取联系人列表的信息,返回 String对象
public String getQueryData(){
String result = "";
//获取ContentResolver对象
ContentResolver resolver =getContentResolver();
Cursor cursor =resolver.query(contactUri, columns, null, null, null);
//获得_ID字段的索引
int idIndex =cursor.getColumnIndex(ContactsContract.Contacts._ID);
//获得Name字段的索引
Int nameIndex =cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
//遍历Cursor提取数据
for (cursor.moveToFirst();(!cursor.isAfterLast());cursor.moveToNext()){
result = result +cursor.getString(idIndex) + "\t";
result = result +cursor.getString(nameIndex)+ "\t\n";
}
cursor.close();
return result;
}
}
加上权限:
<uses-permissionandroid:name="android.permission.READ_CONTACTS" />
效果图:
如果想公开自己的数据,那么就要创建自己的ContentProvider,需要继承ContentProvider类;
完整代码:
AndroidManifest.xml:
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.contentprovider"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:label="@string/app_name"
android:name="SQLiteActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="MyDbProvider"
android:authorities="org.mydb"></provider>
</application>
</manifest>
res/layout/main.xml:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/createDatabase"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="createDatabase"
/>
<Button
android:id="@+id/updateDatabase"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="updateDatabase"
/>
<Button
android:id="@+id/insert"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="insert"/>
<Button
android:id="@+id/update"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="update"/>
<Button
android:id="@+id/query"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="query"/>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/mylist"
></ListView>
</LinearLayout>
res/layout/list.xml:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="50dip"
android:layout_height="wrap_content"
android:id="@+id/userid"
/>
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:id="@+id/name"
/>
</LinearLayout>
SQLiteActivity.java代码:
package org.contentprovider;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class SQLiteActivity extends Activity {
/** Calledwhen the activity is first created. */
private Button createButton;
private Button insertButton;
private Button updateButton;
private Button updateRecordButton;
private Button queryButton;
private ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView =(ListView) findViewById(R.id.mylist);
createButton = (Button)findViewById(R.id.createDatabase);
updateButton = (Button)findViewById(R.id.updateDatabase);
insertButton = (Button)findViewById(R.id.insert);
updateRecordButton =(Button)findViewById(R.id.update);
queryButton = (Button)findViewById(R.id.query);
createButton.setOnClickListener(new CreateListener());
updateButton.setOnClickListener(new UpdateListener());
insertButton.setOnClickListener(new InsertListener());
updateRecordButton.setOnClickListener(newUpdateRecordListener());
queryButton.setOnClickListener(new QueryListener());
}
class CreateListener implements OnClickListener{
@Override
public void onClick(View v) {
//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = newDatabaseHelper(SQLiteActivity.this,"test_mars_db");
}
}
class UpdateListener implements OnClickListener{
@Override
public void onClick(View v) {
DatabaseHelper dbHelper = newDatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
}
}
class InsertListener implements OnClickListener{
@Override
public void onClick(View v) {
//生成ContentValues对象
ContentValues values = new ContentValues();
//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
//values.put("id",1);
values.put("name","zhangsan");
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
//调用insert方法,就可以将数据插入到数据库当中
dbHelper.insert("user", null, values);
//dbHelper.exeecSQL("insertinto user(name) values('123')");
}
}
//更新操作就相当于执行SQL语句当中的update语句
class UpdateRecordListener implementsOnClickListener{
@Override
public void onClick(View arg0) {
//得到一个可写的SQLiteDatabase对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
ContentValues values = new ContentValues();
values.put("name", "zhangsanfeng2");
//第一个参数是要更新的表名
//第二个参数是一个ContentValeus对象
//第三个参数是where子句
//db.update("user",values, "id=? and name=?", new String[]{"1","zhangsanfeng"});
dbHelper.update("user", values, "_id=?", new String[]{"1"});
}
}
class QueryListener implements OnClickListener{
@Override
public void onClick(View v) {
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
//Cursor cursor =db.query("user", new String[]{"id","name"},"id=?", new String[]{"1"}, null, null, null);
Cursor cursor = dbHelper.query("user", new String[]{"_id","name"}, null, null, null, null, null);
/*while(cursor.moveToNext()){
String name =cursor.getString(cursor.getColumnIndex("name"));
//Log.i("myTag","query--->" +name);
//System.out.print("query--->" + name);
Toast.makeText(SQLiteActivity.this,"query--->" + name, 1000).show();
} */
ListAdapter listAdapter=new
SimpleCursorAdapter(SQLiteActivity.this, R.layout.list,
cursor,
new String[]{"_id","name"},
new int[]{R.id.userid,R.id.name});
listView.setAdapter(listAdapter);
}
}
}
MyDbProvider.java代码:
package org.contentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
public class MyDbProvider extends ContentProvider {
DatabaseHelper dbHelper=null;
UriMatcher s=null;
@Override
public int delete(Uri uri, String selection, String[]selectionArgs) {
return dbHelper.delete("user", selection, selectionArgs);
}
@Override
public String getType(Uri uri) {
// TODO Auto-generatedmethod stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
dbHelper.insert("user", null, values);
return null;
}
@Override
public boolean onCreate() {
dbHelper=new DatabaseHelper(getContext(), "test_mars_db");
s=new UriMatcher(UriMatcher.NO_MATCH);
s.addURI("org.mydb", "user", 1);
s.addURI("org.mydb", "user/#", 2);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, Stringselection,String[] selectionArgs, String sortOrder)
{
return dbHelper.query("user", new String[]{"_id","name"}, null, null, null, null, null);
}
@Override
public int update(Uri uri, ContentValues values, Stringselection,String[] selectionArgs)
{
switch(s.match(uri))
{
case 1:Log.i("myTag", "----1");break;
case 2:Log.i("myTag", "----2");break;
}
Log.i("myTag", uri.toString());
return dbHelper.update("user", values,selection, selectionArgs);
}
}
DatabaseHelper.java代码:
package org.contentprovider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.widget.Toast;
//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,
//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作
//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
SQLiteDatabase db=null;
public DatabaseHelper(Context context,String name)
{
this(context,name,VERSION);
}
public DatabaseHelper(Context context,String name,int version)
{
this(context, name,null,version);
}
//在SQLiteOepnHelper的子类当中,必须有该构造函数
public DatabaseHelper(Context context, String name,CursorFactory factory,int version)
{
//必须通过super调用父类当中的构造函数
super(context, name, factory, version);
//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
//getReadableDatabase();
}
public void createOrDelTable(String sql)
{
db=getReadableDatabase();
db.execSQL(sql);
}
public long insert(String table,String column,ContentValues values)
{
db = getWritableDatabase();
return db.insert(table, column, values);
}
public int update(String table,ContentValues values,Stringwhere,String[] whereArgs)
{
db = getWritableDatabase();
return db.update(table, values, where,whereArgs);
}
public int delete(String table,String whereClause,String[]whereArgs)
{
db = getWritableDatabase();
return db.delete(table, whereClause, whereArgs);
}
public Cursor query(String table,String[] columns,Stringselection,String[] selectionArgs,String groupBy,String having,String orderBy)
{
db=getReadableDatabase();
//return db.query(distinct,table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
return db.query(table, columns, selection, selectionArgs, groupBy,having, orderBy);
}
public void exeecSQL(String sql)
{
db =getWritableDatabase();
//db.execSQL("delete from user where id=2 ");
//db.execSQL("insert into user(name) values('tom')");
db.execSQL(sql);
}
//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
@Override
public void onCreate(SQLiteDatabase db)
{
//execSQL函数用于执行SQL语句
db.execSQL("createtable user(_id integer PRIMARY KEY AUTOINCREMENT,name varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("delete fromuser;");
}
}
本文转自上海Android培训教程。