当前位置:   article > 正文

Android开发-数据存储_android sharedpreference销毁

android sharedpreference销毁

目录

12.1、SharedPreference

12.2、File I/O

12.3、sqlite3

1、在Android Shell中操作SQLite

2、APP使用SQLite

12.4、ContentProvider


Android系统提供了四种存储数据方式:SharedPreference,SQLite,Content Provider,File I/O

安卓系统中,数据基本都是私有的,存放于/data/data程序包下,若要在应用之间共享数据,可以使用Content Provider组件。

SQLite是安卓系统提供的轻量级数据库,支持基本的SQL语法

SharedPreference是一个格式化数据文件,采用XML的标记方法,常用于设置参数的存储

文件I/O是对各操作系统模块最基本常见的操作

12.1、SharedPreference

SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置.

比如Activity状态,Activity暂停时,将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。

其中的原理是通过Android系统生成一个xml文件保到:/data/data/包名/shared_prefs目录下,类似键值对的方式来存储数据。

Sharedpreferences提供了常规的数据类型保存接口比如:int、long、boolean、String、Float、Set和Map这些数据类型。

  1.  public abstract SharedPreferences getSharedPreferences (String name,
  2.                  int mode)
参数
nameString: 所需的首选项文件
modeint: 操作模式. Value is either 0 or a combination of MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE, and MODE_MULTI_PROCESS

参数有两个

第一个表示Share文件的名称,不同的名称对应这不同的Share文件,其中的内容也是不同.

第二个参数表示操作模式,操作模式有四种:MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE,MODE_PRIVATE、MODE_MULTI_PROCESS.

  1.  MODE_PRIVATE //默认操作模式(0),只有当前的应用程序才可以对当前这个SharedPreferences文件进行读写。
  2.  MODE_MULTI_PROCESS //用于多个进程共同操作一个SharedPreferences文件。
  3.  MODE_WORLD_WRITEABLE //数据能被其他应用程序读和写.
  4.  MODE_WORLD_READABLE //数据能被其他应用程序读,但不能写.
  1.  SharedPreferences sp=this.getSharedPreferences("myth",MODE_PRIVATE);//1.
  2.  if(sp!=null){
  3.     String stmp;
  4.     Toast.makeText(this,stmp=sp.getString("testmsg","no value"),Toast.LENGTH_SHORT).show();
  5.     if(stmp.equals("no value")){
  6.        SharedPreferences.Editor editor=sp.edit();
  7.        editor.putString("testmsg","SharedPreferences!!");//2.3.
  8.        editor.commit();
  9.     }
  10.  }
  11.  else {
  12.     sp.getString("testmsg","");
  13.  }

步骤:

  1. 获取Editor对象,这个对象用于写入

  2. Editor对象有几个方法需要注入:clear(),commit(),putXXX(),

    clear()为清空Share文件中的内容,commit()为提交,

    editor在put值以后,需要调用commit方法才能被真正写入到Share文件中.

  3. 当要取回数据时,先获取对应的Share

  4. 根据key取出对应的值,其中第二个参数为默认值,即当从Share中取不到时,返回这个值,这里会返回一个空串。

Android会在文件资源的/data/data目录下,创建一个本工程名的目录,我们所编写的“myth”文件就在此

  1.  <map>
  2.      <string name="testmsg">SharedPreferences!!</string>
  3.  </map>

12.2、File I/O

Android自带的文件输入输出流:

  1.  public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException {
  2.      throw new RuntimeException("Stub!");
  3.  }
  4.  public FileInputStream openFileInput(String name) throws FileNotFoundException {
  5.      throw new RuntimeException("Stub!");
  6.  }

变量定义:

  1. EditText file_name,file_content;
  2.  FileOutputStream fos;
  3.  FileInputStream fis;
  4.  Button bt_copy;
  5.  String fname;
  6.  int flag=1;
  7.  file_name=(EditText) findViewById(R.id.exer_filename);
  8.  file_content=(EditText) findViewById(R.id.exer_filecontent);
  9.  bt_copy=(Button)findViewById(R.id.exer_copyfile);
  10.  bt_copy.setEnabled(false);

对于文件存储:

  1. case R.id.exer_savefile:{
  2.      try {
  3.          fname=file_name.getText()==null?"":file_name.getText().toString();//判断取值
  4.          if(!fname.equals("")) {
  5.              fos = openFileOutput(fname + ".txt", MODE_PRIVATE);
  6.         }
  7.          else fos=openFileOutput("defaultname.txt",MODE_PRIVATE);
  8.          //如果文件名文本框为空,则自动创建一个defaultname.txt文件
  9.          String content=file_content.getText().toString();
  10.          fos.write(content.getBytes());//字节流输入
  11.          if(fos!=null)//设置赋值按钮可用
  12.         {
  13.              bt_copy.setEnabled(true);
  14.         }
  15.     } catch (FileNotFoundException e) {
  16.          e.printStackTrace();
  17.     } catch (IOException e) {
  18.          e.printStackTrace();
  19.     }finally {
  20.          try {
  21.              if(fos!=null) {
  22.                  fos.flush();
  23.                  fos.close();
  24.             }
  25.         }catch (IOException e){
  26.              e.printStackTrace();
  27.         }
  28.     }
  29.      file_name.setText("");//清空内容
  30.      file_content.setText("");//清空内容
  31.      break;
  32.  }

对于文件复制:

  1. case R.id.exer_copyfile:{
  2.      try {
  3.          fis=openFileInput(fname+".txt");
  4.          int n=0;
  5.          StringBuffer stringBuffer=new StringBuffer();//用于存放读取的字节流
  6.         do{
  7.              n=fis.read();
  8.              if(n!=-1)
  9.                  stringBuffer.append((char)n);
  10.         }while (n!=-1);
  11.          fos = openFileOutput(fname + "("+flag+")"+".txt", MODE_PRIVATE);//flag用于多次复制
  12.          fos.write(stringBuffer.toString().getBytes());
  13.     } catch (FileNotFoundException e) {
  14.          e.printStackTrace();
  15.     } catch (IOException e) {
  16.          e.printStackTrace();
  17.     }finally {
  18.              try {
  19.                  if(fis!=null)
  20.                      fis.close();
  21.                  if(fos!=null)
  22.                 {
  23.                      fos.flush();
  24.                      fos.close();
  25.                 }
  26.             } catch (IOException e) {
  27.                  e.printStackTrace();
  28.             }
  29.  ​
  30.     }
  31.      flag++;
  32.      break;
  33.  }

12.3、sqlite3

1、在Android Shell中操作SQLite

通过命令提示符定位到adb.exe所在路径:

使用shell命令即可运行,执行sqlite3即可进入sqlite数据库

注:运行adb时只能有一个设备连接,否则会出现错误

注意:在连接自己手机时,需要root权限才能查看data数据 

2、APP使用SQLite

准备数据库有关的基本信息

  1.  private static final String DB_NAME = "people.db";
  2.  private static final int DB_VERSION = 1;
  3.  private static final String TB_NAME1 = "peopleinfo";
  4.  ​
  5.  public static final String KEY_ID = "_id";
  6.  public static final String KEY_NAME = "name";
  7.  public static final String KEY_AGE = "age";
  8.  public static final String KEY_HEIGHT = "height";

创建数据库对象

  1.  public class DBHelper extends SQLiteOpenHelper {
  2.      Context context;//供Toast使用
  3.      public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
  4.          super(context, name, factory, version);
  5.          this.context=context;
  6.     }
  7.      @Override
  8.      public void onCreate(SQLiteDatabase sqLiteDatabase) {
  9.  ​
  10.     }
  11.  ​
  12.      @Override
  13.      public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  14.  ​
  15.     }
  16.      //oncreate,一般进行数据表的创建;
  17.      //该函数的形参,为帮助器成功连接数据库后连接到的数据库对象的引用
  18.      //onupgrade,一般销毁或更新数据表
  19.  }

继承SQLiteOpenHelper类,调用其构造方法岂可创建一个数据库对象

参数:
contextContext: 依附的安卓组件,用于定位数据库的路径,可为空
nameString: 数据库文件名
factorySQLiteDatabase.CursorFactory: 用于创建游标对象,默认为null
versionint: 数据库标号(从1开始)如果数据库较旧,则使用onUpgrade(sqlitedatdatabase, int, int)来升级数据库;如果数据库较新,则使用onDowngrade(SQLiteDatabase, int, int)来降级数据库

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.      android:layout_width="match_parent"
  4.      android:layout_height="match_parent"
  5.      android:orientation="vertical" >
  6.      <Button android:id="@+id/exer_createdb"
  7.          android:layout_width="wrap_content"
  8.          android:layout_height="wrap_content"
  9.          android:text="exer创建/连接数据库" />
  10.      <TextView android:id="@+id/exer_content"
  11.          android:layout_width="match_parent"
  12.          android:layout_height="wrap_content"
  13.          android:text="数据库内容为:"/>
  14.  ​
  15.      <TextView android:layout_width="match_parent"
  16.          android:layout_height="wrap_content"
  17.          android:text="操作数据库:" />
  18.      <LinearLayout android:layout_width="match_parent"
  19.          android:layout_height="wrap_content"
  20.          android:orientation="horizontal">
  21.          <TextView android:layout_width="wrap_content"
  22.          android:layout_height="wrap_content"
  23.          android:text="姓名:"/>
  24.          <EditText
  25.          android:id="@+id/exer_name"
  26.          android:layout_width="wrap_content"
  27.          android:layout_height="wrap_content"
  28.          android:inputType="text"/>
  29.      </LinearLayout>
  30.      <LinearLayout android:layout_width="match_parent"
  31.          android:layout_height="wrap_content"
  32.          android:orientation="horizontal">
  33.          <TextView
  34.          android:layout_width="wrap_content"
  35.          android:layout_height="wrap_content"
  36.          android:text="年龄: "/>
  37.          <EditText
  38.          android:id="@+id/exer_age"
  39.          android:layout_width="wrap_content"
  40.          android:layout_height="wrap_content"
  41.          android:inputType="number"/>
  42.      </LinearLayout>
  43.      <LinearLayout android:layout_width="match_parent"
  44.          android:layout_height="wrap_content"
  45.          android:orientation="horizontal">
  46.          <TextView android:layout_width="wrap_content"
  47.          android:layout_height="wrap_content"
  48.          android:text="身高: "/>
  49.          <EditText
  50.          android:id="@+id/exer_height"
  51.          android:layout_width="wrap_content"
  52.          android:layout_height="wrap_content"
  53.          android:inputType="number"/>
  54.      </LinearLayout>
  55.      <Button android:id="@+id/exer_insert"
  56.          android:layout_width="wrap_content"
  57.          android:layout_height="wrap_content"
  58.          android:text="插入记录"/>
  59.      <LinearLayout android:layout_width="match_parent"
  60.          android:layout_height="wrap_content"
  61.          android:orientation="horizontal">
  62.          <TextView android:layout_width="wrap_content"
  63.          android:layout_height="wrap_content"
  64.          android:text="当ID为: "/>
  65.          <EditText
  66.          android:id="@+id/exer_id"
  67.          android:layout_width="wrap_content"
  68.          android:layout_height="wrap_content"
  69.          android:inputType="number"/>
  70.          <Button android:id="@+id/exer_query"
  71.          android:layout_width="wrap_content"
  72.          android:layout_height="wrap_content"
  73.          android:text="查询记录"/>
  74.          <Button android:id="@+id/exer_delete"
  75.          android:layout_width="wrap_content"
  76.          android:layout_height="wrap_content"
  77.          android:text="删除记录"/>
  78.      </LinearLayout>
  79.      <TextView android:layout_width="wrap_content"
  80.          android:layout_height="wrap_content"
  81.          android:id="@+id/exer_result"
  82.          android:text="操作结果为:"/>
  83.      
  84.      <!-- space -->
  85.      <Space android:layout_width="match_parent"
  86.          android:layout_height="16dip"/>
  87.      
  88.      <!-- hori bar -->
  89.      <View android:layout_width="match_parent"
  90.          android:layout_height="2dip"
  91.          android:background="#9b9b9b"/>
  92.          
  93.      <Button
  94.          android:id="@+id/exer_queryall"
  95.          android:layout_width="wrap_content"
  96.          android:layout_height="wrap_content"
  97.          android:text="查询所有"/>
  98.      <TextView
  99.          android:id="@+id/exer_info"
  100.          android:layout_width="match_parent"
  101.          android:layout_height="wrap_content"
  102.          android:text="info:"/>
  103.  </LinearLayout>

连接数据库

  1. case R.id.exer_createdb:{
  2.      if(helper!=null){
  3.          Log.i("mytag","helper not null");
  4.          try {
  5.              //调用构造函数来建立数据库对象
  6.              //回调oncreate函数
  7.              db=helper.getWritableDatabase();
  8.         }catch (Exception e){
  9.              Toast.makeText(DBTest.this,"数据库创建失败",Toast.LENGTH_SHORT).show();
  10.         }
  11.     }
  12.      else{
  13.          Log.i("mytag","helper is null");
  14.     }
  15.      break;
  16.  }
  17.  @Override
  18.  public void onCreate(SQLiteDatabase sqLiteDatabase) {
  19.      if (sqLiteDatabase != null) {
  20.          //执行数据库语句创建数据表
  21.          sqLiteDatabase.execSQL("create table " + TB_NAME1 + "(" +
  22.                  KEY_ID + " integer primary key autoincrement, " +
  23.                  KEY_NAME + " text not null, " +
  24.                  KEY_AGE + " integer, " +
  25.                  KEY_HEIGHT + " double" +
  26.                  ");");
  27.     }
  28.  }
  29.  @Override
  30.  public void onUpgrade(SQLiteDatabase db, int i, int i1) {
  31.      if(db != null) {
  32.          db.execSQL("drop table if exists " + TB_NAME1);
  33.          onCreate(db);
  34.     }
  35.  }

我们所有的CRUD操作都放在Helper类中编写

查询所有数据

  1.  public String queryall(SQLiteDatabase sqLiteDatabase) {
  2.      Cursor cursor = null;
  3.      String str = "";
  4.      if (sqLiteDatabase != null)
  5.          cursor = sqLiteDatabase.query(TB_NAME1, null, null, null, null, null, null);
  6.          if (cursor != null) {
  7.              cursor.moveToFirst();
  8.              do{
  9.                  str += "id:" + cursor.getInt(0) +
  10.                          "name:" + cursor.getString(1) +
  11.                          "age" + cursor.getInt(2) +
  12.                          "height" + cursor.getDouble(3) + "\n";
  13.             }while (cursor.moveToNext());
  14.         }
  15.          else {
  16.              Toast.makeText(this.context,"查询失败",Toast.LENGTH_SHORT).show();
  17.         }
  18.          if(str.equals("")||str.hashCode()==0)
  19.              return "null";
  20.          else
  21.              return str;
  22.  }
  1.  //构造方法
  2.  public Cursor query (String table,
  3.                  String[] columns,
  4.                  String selection,
  5.                  String[] selectionArgs,
  6.                  String groupBy,
  7.                  String having,
  8.                  String orderBy)
Parameters
tableString: 要编译查询的表名
columnsString: 要返回的列的列表。传递null将返回所有列。
selectionString:声明要返回哪些行的过滤器,格式化为SQL WHERE子句(不包括WHERE本身)。传递null将返回给定表的所有行。
selectionArgsString: 您可以在selection中包含'?',它们将被来自selectionArgs的值替换,以便它们出现在选择中。这些值将被绑定为string
groupByString: 一个过滤器,声明如何将格式化为SQL group BY子句的行分组(不包括group BY本身)。传递null将导致行不分组。
havingString: 如果使用行分组,则过滤器声明将哪些行组包含在游标中,格式化为SQL HAVING子句(不包括HAVING本身)。传递null将导致包含所有行组,当不使用行分组时需要此参数。
orderByString: 如何对格式化为SQL order BY子句的行进行排序(不包括order BY本身)。传递null将使用默认的排序顺序,这可能是无序的。

Cursor游标:

Query函数会返回一个游标

Returns
CursorCursor : 它位于第一个条目之前。注意游标不是同步的,

通过id查询

  1.  String arg[]={id};
  2.  cursor=sqLiteDatabase.query(TB_NAME1,null,KEY_ID+"=?",arg,null,null,null);
  3.  //通过selection指明的where来进行判断

插入一条记录

  1.  public long insert(String name,String age,String height,SQLiteDatabase sqLiteDatabase){
  2.      Log.i("mytag","insert");
  3.      long row=0;
  4.          ContentValues contentValues=new ContentValues();
  5.          contentValues.put(KEY_HEIGHT,height);
  6.          contentValues.put(KEY_AGE,age);
  7.          contentValues.put(KEY_NAME,name);
  8.  ​
  9.      if(sqLiteDatabase!=null)
  10.     {
  11.          row=sqLiteDatabase.insert(TB_NAME1,KEY_NAME,contentValues);
  12.          Log.i("mytag","row:"+row);
  13.     }
  14.      return row;
  15.  }
  1. //构造方法
  2.  public long insert (String table,
  3.                  String nullColumnHack,
  4.                  ContentValues values)
Parameters
tableString: 要插入的表名
nullColumnHackString: 可选的;可能是null。SQL不允许在没有命名至少一个列名的情况下插入一个完全空的行。如果提供的值为空,则没有已知的列名,不能插入空行。如果不设置为空,nullColumnHack参数提供可空列名的名称,以便在值为空的情况下显式插入null。
valuesContentValues:此映射包含该行的初始列值。键应该是列名,值应该是列值

删除一条数据

  1.  public int deletebyid(String id,SQLiteDatabase sqLiteDatabase){
  2.      int row=0;
  3.      String arg[]={id};
  4.      if(sqLiteDatabase!=null)
  5.          row=sqLiteDatabase.delete(TB_NAME1,KEY_ID+"=?",arg);
  6.      return row;
  7.  }
  1.  //构造函数
  2.  public int delete (String table,
  3.                  String whereClause,
  4.                  String[] whereArgs)
Parameters
tableString:要操作的表名
whereClauseString:在删除时应用可选的WHERE子句。传递null将删除所有行。
whereArgsString:可以在where子句中包含'?',该子句将被来自whereArgs的值替换。这些值将被绑定为string。

12.4、ContentProvider

ContentProvider(内容提供者)是Android中的四大组件之一。

主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。

ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

步骤:

1.自定义类继承ContentProvider,并重写6个函数

  1. public class cp extends ContentProvider {
  2.      DBHelper helper;//数据库
  3.      SQLiteDatabase database;
  4.  /*oncreate:
  5.      获取数据库指针
  6.      将数据库连接封装到helper中的自定义类opendb
  7.      主程序只需要调用方法即可拿到db对象
  8.  */
  9.      @Override
  10.      public boolean onCreate() {
  11.          helper=new DBHelper(TESTCP.this.getContext());
  12.          database=helper.opendb();
  13.          return true;
  14.     }
  15.  //oncreate()函数在创建cp对象后回调,一般在oncreate中建立cp与数据源的连接
  16.  //需要根据数据源的初始化情况,手动返回bool
  17. @Nullable
  18. @Override
  19. public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
  20. database=helper.opendb();
  21. Cursor cursor=null;
  22. if(uri.toString().equals(uri_str+multi_path1))
  23. cursor=helper.Queryall(database);
  24. else if(uri.toString().equals(uri_str+Single_path1))
  25. cursor=helper.QueryByID(database,selectionArgs);
  26. return cursor;
  27. }
  28.  ​
  29.  /*getType:
  30.   定义数据源的MIME类型
  31.   格式:type/subtype
  32.   在安卓中自定义mime类型   vnd.android.cursor.dir/ vnd.android.cursor.item/
  33.   以上两种cp的mime类型使用了安卓规定的主类型,子类型可以自定义
  34.   .dir/ 对应数据集(表或多行记录)
  35.   .item/ 对应单个数据(单条记录)
  36.  
  37.   安卓中,自定义cp的uri时,要注意其对应的mime类型
  38.   content://com.mo.cp/testcp/#
  39.   "content://com.mo.cp/" 定位到数据源
  40.   "testcp"定位到数据表
  41.   "/#" 定位到表中某条记录
  42.   uri协议如果配合content使用则协议必须使用content
  43.  */
  44. String uri_str="content://com.mo.cp",multi_path1="/testcp",Single_path1="/testcp/#";
  45. @Nullable
  46. @Override
  47. public String getType(@NonNull Uri uri) {
  48. if(uri.toString().equals(uri_str+multi_path1))
  49. return "vnd.android.cursor.dir/mytestcp";
  50. else if(uri.toString().equals(uri_str+Single_path1))
  51. return "vnd.android.cursor.item/mytestcp";
  52. else
  53. return null;
  54. }
  55.      //getType()函数主要用来根据uri来返回对应的mime类型
  56.  ​
  57.      @Nullable
  58.      @Override
  59.      public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
  60.          long res=-1;
  61.          if(uri.toString().equals(uri_str+multi_path1))
  62.              if(helper!=null)
  63.                  res=helper.insertdb(database,contentValues);
  64.          if (res!=-1) {
  65.              helper.closedb(database);
  66.              return Uri.parse(uri_str + multi_path1 + "/" + res);
  67.         }
  68.          else {
  69.              helper.closedb(database);
  70.              return null;
  71.         }
  72.          //插入成功后,要手动返回新的uri值
  73.     }
  74.  ​
  75.      @Override
  76.      public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
  77.          int res=0;
  78.          if (uri.toString().equals(uri_str+Single_path1)){
  79.              res=helper.delete(database,s,strings);
  80.         }
  81.          return res;
  82.     }
  83.  ​
  84.      @Override
  85.      public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
  86.          return 0;
  87.     }
  88.  }

2.编写DBHelper函数建立与数据库的连接

  1.  public class DBHelper extends SQLiteOpenHelper {
  2.      Context context;
  3.      private static final String DB_NAME = "people.db";
  4.      private static final int DB_VERSION = 1;
  5.      private static final String TB_NAME1 = "userinfo";
  6.  ​
  7.      public static final String KEY_ID = "_id";
  8.      public static final String KEY_NAME = "name";
  9.      public static final String KEY_AGE = "age";
  10.      public static final String KEY_HEIGHT = "height";
  11.  ​
  12.      public DBHelper(@Nullable Context context) {
  13.          super(context, DB_NAME, null,DB_VERSION);
  14.          this.context=context;
  15.     }
  16.  ​
  17.      @Override
  18.      public void onCreate(SQLiteDatabase sqLiteDatabase) {
  19.          sqLiteDatabase.execSQL("create table " + TB_NAME1 + "(" +
  20.                  KEY_ID + " integer primary key autoincrement, " +
  21.                  KEY_NAME + " text not null, " +
  22.                  KEY_AGE + " integer, " +
  23.                  KEY_HEIGHT + " double" +
  24.                  ");");
  25.     }
  26.  ​
  27.      public SQLiteDatabase opendb(){
  28.          SQLiteDatabase db=null;
  29.          try {
  30.              db=this.getWritableDatabase();
  31.         }catch (Exception e){
  32.              Log.i("mytag","db open failed...");
  33.         }
  34.  ​
  35.          return db;
  36.     }
  37.      public void closedb(SQLiteDatabase database){
  38.          if(database!=null)
  39.              database.close();
  40.     }
  41.      public long insertdb(SQLiteDatabase database, ContentValues contentValues){
  42.          long res=-1;
  43.          if(database!=null)
  44.              res=database.insert(TB_NAME1,null,contentValues);
  45.          return res;
  46.     }
  47.      //查询所有用户信息
  48.      public Cursor Queryall(SQLiteDatabase database){
  49.          Cursor cursor=null;
  50.          if(database!=null)
  51.              cursor=database.query(TB_NAME1,null,null,null,null,null,null);
  52.          return cursor;
  53.     }
  54.      //通过ID号查询信息
  55.      public Cursor QueryByID(SQLiteDatabase database,String[] selectionArgs){
  56.          Cursor cursor=null;
  57.          if(database!=null)
  58.              cursor=database.query(TB_NAME1,null,KEY_ID+"=?",selectionArgs,null,null,null);
  59.          return cursor;
  60.     }
  61.      //删除一条记录
  62.      public int delete(SQLiteDatabase database,String whereClause,String[] whereArgs){
  63.          int res=0;
  64.          if(database!=null)
  65.              res=database.delete(TB_NAME1,whereClause,whereArgs);
  66.          return res;
  67.     }
  68.      @Override
  69.      public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  70.  ​
  71.     }
  72.  }

3.在清单文件中对provider对象进行注册

  1.  <!--要与自定义的mime类型一致-->
  2.  <provider
  3.      android:authorities="com.mo.cp"
  4.      android:name=".TESTCP"
  5.      android:exported="true">
  6.  </provider>

4.新建Model项目通过ContentResolver对象来实现CRUD

  1.  public class Amain extends Activity {
  2.      ContentResolver contentResolver;
  3.  ​
  4.      EditText name,age,height;
  5.      @Override
  6.      protected void onCreate(@Nullable Bundle savedInstanceState) {
  7.          super.onCreate(savedInstanceState);
  8.          setContentView(R.layout.ly_amain);
  9.          name=(EditText)findViewById(R.id.exer_id);
  10.          age=(EditText)findViewById(R.id.exer_age);
  11.          height=(EditText)findViewById(R.id.exer_height);
  12.  ​
  13.          contentResolver=getContentResolver();
  14.          Listener Listener=new Listener();
  15.          findViewById(R.id.exer_insert).setOnClickListener(Listener);
  16.          findViewById(R.id.exer_queryall).setOnClickListener(Listener);
  17.          findViewById(R.id.exer_query).setOnClickListener(Listener);
  18.          findViewById(R.id.exer_delete).setOnClickListener(Listener);
  19.  ​
  20.     }
  21.      class Listener implements View.OnClickListener{
  22.          @Override
  23.          public void onClick(View view) {
  24.              switch (view.getId()){
  25.                  case R.id.exer_insert:{
  26.                      Uri res=null;
  27.                      ContentValues contentValues=new ContentValues();
  28.                      contentValues.put(profile.KEY_NAME,name.getText().toString());
  29.                      contentValues.put(profile.KEY_AGE,age.getText().toString());
  30.                      contentValues.put(profile.KEY_HEIGHT,height.getText().toString());
  31.                      if(contentResolver!=null)
  32.                          res=contentResolver.insert(Uri.parse(profile.uri_str+profile.multi_path1),contentValues);
  33.                      if(res==null)
  34.                          Toast.makeText(Amain.this,"failed",Toast.LENGTH_SHORT).show();
  35.                      else
  36.                          Toast.makeText(Amain.this,res.toString(),Toast.LENGTH_LONG).show();
  37.                      break;
  38.                 }
  39.                  case R.id.exer_queryall:{
  40.                      Cursor cursor=null;
  41.                      String str="";
  42.                      if(contentResolver!=null)
  43.                         cursor= contentResolver.query(Uri.parse(profile.uri_str+profile.multi_path1),null,null,null,null);
  44.                      while (cursor.moveToNext()){
  45.                          str += "id:" + cursor.getInt(0) +
  46.                                  "name:" + cursor.getString(1) +
  47.                                  "age" + cursor.getInt(2) +
  48.                                  "height" + cursor.getDouble(3) + "\n";
  49.                          TextView tv=findViewById(R.id.exer_info);
  50.                          tv.setText(str);
  51.                     }
  52.                      break;
  53.                 }
  54.                  case R.id.exer_query:{
  55.                      String id=((EditText) findViewById(R.id.exer_id)).getText().toString();
  56.                      Cursor cursor=null;
  57.                      String str="";
  58.                      String[] arg={id};
  59.                      if(contentResolver!=null){
  60.                          cursor=contentResolver.query(Uri.parse(profile.uri_str+ profile.Single_path1),null,null,arg,null);
  61.                     }
  62.                      cursor.moveToNext();
  63.                          str += "id:" + cursor.getInt(0) +
  64.                                  "name:" + cursor.getString(1) +
  65.                                  "age" + cursor.getInt(2) +
  66.                                  "height" + cursor.getDouble(3) + "\n";
  67.                          TextView tv = findViewById(R.id.exer_result);
  68.                          tv.setText(str);
  69.  ​
  70.                      break;
  71.                 }
  72.                  case R.id.exer_delete:{
  73.                      String id=((EditText) findViewById(R.id.exer_id)).getText().toString();
  74.                      int res=0;
  75.                      if(contentResolver!=null){
  76.                          res=contentResolver.delete(Uri.parse(profile.uri_str+profile.Single_path1),profile.KEY_ID+"=?",new String[]{id});
  77.                     }
  78.                      if(res>0)
  79.                          Toast.makeText(Amain.this,"删除成功",Toast.LENGTH_SHORT).show();
  80.                      else
  81.                          Toast.makeText(Amain.this,"删除失败",Toast.LENGTH_SHORT).show();
  82.                      break;
  83.                 }
  84.             }
  85.         }
  86.     }
  87.  ​
  88.      @Override
  89.      protected void onDestroy() {
  90.          super.onDestroy();
  91.     }
  92.  }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/机器思考机器/article/detail/60771?site
推荐阅读
相关标签
  

闽ICP备14008679号