Android 软件开发之数据的 新建 储存 读取 删除 详解(转)

1.使用SharedPreferences处理数据的 新建 储存 读取 删除


        SharedPreferences保存后生成的是XML文件,内容是以节点的形势保存在文件中,SharedPreferences类提供了非常丰富的处理数据的方法下面我向大家介绍一下如何使用SharedPreferences来处理数据。


输入须要保存的内容
2.gif 
输入姓名:雨松MOMO
输入号码:15810463139
3.gif 
点击保存成功
4.gif 
        保存成功以后,数据被保存到了data路径下 /当前包名 (红框内的包名是我的程序包名) /shared_prefs/main.xml中 , 使用EditPlus 打开保存的内容,我们可以清晰的看到内容是以一个节点一个节点的形式存在XML中。
5.gif 
         SharedPreferences类中提供了非常方便方法去保存数据与读取数据大家请看下面的代码片段,一个程序中可以存在多个SharedPreferences保存的XML文件 ,代码中只须要根据不同的XML名称就可以通过方法拿到相应的对象,由于它的批量遍历查找,当然这样的作法肯定没有数据库更方便快捷,所以在开发中处理一些比较小的零碎的数据就可以保存在这里,比如说记录软件中用户设置的音量大小,用户输入的查找信息等等都可以存在SharedPreferences中。
  1. public class SPActivity extends Activity {
  2.    
  3.     /**使用SharedPreferences 来储存与读取数据**/
  4.     SharedPreferences mShared = null;

  5.     /**程序中可以同时存在多个SharedPreferences数据, 根据SharedPreferences的名称就可以拿到对象**/
  6.     public final static String SHARED_MAIN = "main";
  7.    
  8.     /**SharedPreferences中储存数据的Key名称**/
  9.     public final static String KEY_NAME = "name";
  10.     public final static String KEY_NUMBER = "number";
  11.     
  12.     /**SharedPreferences中储存数据的路径**/
  13.     public final static String DATA_URL = "/data/data/";
  14.     public final static String SHARED_MAIN_XML = "main.xml";
  15.     
  16.     
  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         setContentView(R.layout.sharedpreferences);
  20.         /**拿到名称是SHARED_MAIN 的SharedPreferences对象**/
  21.         mShared = getSharedPreferences(SHARED_MAIN, Context.MODE_PRIVATE);
  22.         /**拿到SharedPreferences中保存的数值 第二个参数为如果SharedPreferences中没有保存就赋一个默认值**/
  23.         String name = mShared.getString(KEY_NAME, "数据库中没有储存姓名");
  24.         String number = mShared.getString(KEY_NUMBER, "数据库中没有储存号码");
  25.         
  26.         final EditText editName = (EditText)findViewById(R.id.sp_et0);
  27.         final EditText editNumber = (EditText)findViewById(R.id.sp_et1);
  28.         editName.setHint("上次输入的姓名为【 " +name+"】");
  29.         editNumber.setHint("上次输入的号码为【 " +number+"】");
  30.         
  31.         Button button0 = (Button)findViewById(R.id.sp_button0);
  32.         
  33.         /**监听按钮点击后保存用户输入信息到SharedPreferences中**/
  34.         button0.setOnClickListener(new  OnClickListener() {
  35.             
  36.             @Override
  37.             public void onClick(View arg0) {
  38.                 /**拿到用户输入的信息**/
  39.                 String name = editName.getText().toString();
  40.                 String number = editNumber.getText().toString();
  41.                 /**开始保存入SharedPreferences**/
  42.                 Editor editor = mShared.edit();
  43.                 editor.putString(KEY_NAME, name);
  44.                 editor.putString(KEY_NUMBER, number);
  45.                 /**put完毕必需要commit()否则无法保存**/
  46.                 editor.commit();
  47.                 ShowDialog("保存SharedPreferences成功");
  48.                 
  49.             }
  50.         });
  51.         
  52.         Button button1 = (Button)findViewById(R.id.sp_button1);
  53.         button1.setOnClickListener(new  OnClickListener() {
  54.             
  55.             @Override
  56.             public void onClick(View arg0) {
  57.                 /**开始清除SharedPreferences中保存的内容**/
  58.                 Editor editor = mShared.edit();
  59.                 editor.remove(KEY_NAME);
  60.                 editor.remove(KEY_NUMBER);
  61.                 //editor.clear();
  62.                 editor.commit();
  63.                 ShowDialog("清除SharedPreferences数据成功");
  64.             }
  65.         });
  66.         
  67.         Button button2 = (Button)findViewById(R.id.sp_button2);
  68.         button2.setOnClickListener(new OnClickListener() {

  69.             @Override
  70.             public void onClick(View arg0) {
  71.                 /** 删除SharedPreferences文件 **/
  72.                 File file = new File(DATA_URL + getPackageName().toString()
  73.                         + "/shared_prefs", SHARED_MAIN_XML);
  74.                 if (file.exists()) {
  75.                     file.delete();
  76.                 }
  77.                 ShowDialog("删除SharedPreferences文件成功");
  78.             }
  79.         });
  80.         
  81.         
  82.         super.onCreate(savedInstanceState);
  83.     }

  84.     public void ShowDialog(String string) {
  85.         AlertDialog.Builder builder = new AlertDialog.Builder(SPActivity.this);
  86.         builder.setIcon(R.drawable.icon);
  87.         builder.setTitle(string);
  88.         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  89.             public void onClick(DialogInterface dialog, int whichButton) {
  90.                 finish();
  91.             }
  92.         });
  93.         builder.show();
  94.     }
  95. }
复制代码
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.         android:layout_width="fill_parent" 
  4.         android:layout_height="fill_parent"
  5.         android:orientation="vertical"
  6.         >
  7.         <ImageView android:id="@+id/sp_image"
  8.                 android:layout_width="wrap_content"
  9.                  android:layout_height="wrap_content"
  10.                 android:src="@drawable/image"
  11.                 android:layout_gravity="center"
  12.                 />
  13.         <EditText android:id="@+id/sp_et0"
  14.                           android:layout_width="fill_parent"
  15.                       android:layout_height="wrap_content"
  16.                       android:hint="请输入你的姓名">
  17.         </EditText>
  18.         <EditText android:id="@+id/sp_et1"
  19.                           android:layout_width="fill_parent"
  20.                       android:layout_height="wrap_content"
  21.                       android:hint="请输入你的号码">
  22.         </EditText>
  23.         <Button   android:id="@+id/sp_button0"
  24.                   android:layout_width="wrap_content"
  25.                       android:layout_height="wrap_content"
  26.                       android:text="保存输入内容shared">
  27.         </Button>
  28.         <Button   android:id="@+id/sp_button1"
  29.                   android:layout_width="wrap_content"
  30.                       android:layout_height="wrap_content"
  31.                       android:text="清除shared保存内容">
  32.         </Button>
  33.         <Button   android:id="@+id/sp_button2"
  34.                   android:layout_width="wrap_content"
  35.                       android:layout_height="wrap_content"
  36.                       android:text="删除shared文件">
  37.         </Button>
  38. </LinearLayout>
复制代码
2.在本地data文件下使用自己生成的文件处理数据的 新建 储存 读取 删除 

       如果说不想把内容存在SharedPreferences中的话,我们可以自己写一个文件保存须要的数据,在这里我将文件保存在系统中的工程路径下。

输入需要保存的内容

6.gif 

保存完毕后红框内呈现之前保存的数据
7.gif 

        保存文件以后,文件被保存在了当前工程下 files 文件夹的路径下,这里说一下data文件夹 如果手机没有root 权限 用户是访问不到的,这种储存方式有一个麻烦的地方就是文件中保存的数据须要程序员自己去处理 , 好比文件中保存了很多字符串数据 但是我们只须要其中的一部分数据,这样就须要自己去写代码去从文件中拿需要的数据。
8.gif
  1. public class FileActivity extends Activity {
  2.     public final static String FILE_NAME = "a.txt";
  3.    
  4.     /**File中储存数据的路径**/
  5.     public final static String DATA_URL = "/data/data/";
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         setContentView(R.layout.file);
  9.         /**读取内容**/
  10.         String content = loadFile();
  11.         if(content == null) {
  12.             content ="上次没有输入内容请输入"; 
  13.         }
  14.          String str  = "上次输入保存的内容的姓名为【 " +content + "】";
  15.         final EditText editContent = ((EditText)findViewById(R.id.file_et0));
  16.         editContent.setHint(str);
  17.         Button button0 = (Button)findViewById(R.id.file_button0);
  18.         
  19.         /**监听按钮点击后保存用户输入信息到file中**/
  20.         button0.setOnClickListener(new  OnClickListener() {
  21.             @Override
  22.             public void onClick(View arg0) {
  23.                 /**拿到用户输入的信息**/
  24.                 String content = editContent.getText().toString();
  25.                 /**开始保存入file**/
  26.                 saveFile(content);
  27.                 ShowDialog("保存File文件成功");
  28.             }
  29.         });
  30.         
  31.         Button button1 = (Button)findViewById(R.id.file_button1);
  32.         /**监听按钮点击后清空file中内容**/
  33.         button1.setOnClickListener(new  OnClickListener() {
  34.             @Override
  35.             public void onClick(View arg0) {
  36.                 cleanFile();
  37.                 ShowDialog("清空File文件成功");
  38.             }
  39.         });
  40.         
  41.         Button button2 = (Button)findViewById(R.id.file_button2);
  42.         
  43.         /**监听按钮点击后删除file文件**/
  44.         button2.setOnClickListener(new  OnClickListener() {
  45.             @Override
  46.             public void onClick(View arg0) {
  47.                 File file = new File(DATA_URL + getPackageName().toString()
  48.                         + "/files", FILE_NAME);
  49.                 if (file.exists()) {
  50.                     file.delete();
  51.                 }
  52.                 ShowDialog("删除file文件成功");
  53.             }
  54.         });
  55.         
  56.         super.onCreate(savedInstanceState);
  57.     }
  58.     
  59.     /**
  60.      * 保存内容
  61.      * @param str
  62.      */
  63.     public void saveFile(String str) {
  64.         try {
  65.             FileOutputStream outStream = this.openFileOutput(FILE_NAME,
  66.                     Context.MODE_WORLD_READABLE);
  67.             outStream.write(str.getBytes());
  68.             outStream.close();
  69.         } catch (FileNotFoundException e) {
  70.         } catch (IOException e) {
  71.         }
  72.     }

  73.     /**
  74.      * 因为java删除文件内容只有一种实现方法,就是把整个文件重写,只是把须要删除的那一条记录去除掉 
  75.      */
  76.     public void cleanFile() {
  77.         //如果只须要删除文件中的一部分内容则须要在这里对字符串做一些操作
  78.         String cleanStr = "";
  79.         try {
  80.             FileOutputStream outStream = this.openFileOutput(FILE_NAME,
  81.                     Context.MODE_WORLD_READABLE);
  82.             outStream.write(cleanStr.getBytes());
  83.             outStream.close();
  84.         } catch (FileNotFoundException e) {
  85.         } catch (IOException e) {
  86.         }

  87.     }
  88.     

  89.     
  90.     
  91.     public String loadFile() {
  92.         try {
  93.             FileInputStream inStream = this.openFileInput(FILE_NAME);
  94.             ByteArrayOutputStream stream = new ByteArrayOutputStream();
  95.             byte[] buffer = new byte[1024];
  96.             int length = -1;
  97.             while ((length = inStream.read(buffer)) != -1) {
  98.                 stream.write(buffer, 0, length);
  99.             }
  100.             stream.close();
  101.             inStream.close();
  102.             return stream.toString();
  103.         } catch (FileNotFoundException e) {
  104.             e.printStackTrace();
  105.         } catch (IOException e) {
  106.         }
  107.         return null;
  108.     }
  109.     
  110.     public void ShowDialog(String str) {
  111.         AlertDialog.Builder builder = new AlertDialog.Builder(FileActivity.this);
  112.         builder.setIcon(R.drawable.icon);
  113.         builder.setTitle(str);
  114.         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  115.             public void onClick(DialogInterface dialog, int whichButton) {
  116.                 finish();
  117.             }
  118.         });
  119.         builder.show();
  120.     }
  121. }
复制代码
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.         android:layout_width="fill_parent" 
  4.         android:layout_height="fill_parent"
  5.         android:orientation="vertical"
  6.         >
  7.         <ImageView android:id="@+id/file_image"
  8.                 android:layout_width="wrap_content"
  9.                  android:layout_height="wrap_content"
  10.                 android:src="@drawable/jay"
  11.                 android:layout_gravity="center"
  12.                 />
  13.         
  14.         <EditText android:id="@+id/file_et0"
  15.                           android:layout_width="fill_parent"
  16.                       android:layout_height="wrap_content"
  17.                       android:hint="请输入需要保存的内容">
  18.         </EditText>
  19.         <Button   android:id="@+id/file_button0"
  20.                   android:layout_width="wrap_content"
  21.                       android:layout_height="wrap_content"
  22.                       android:text="保存入file">
  23.         </Button>
  24.         <Button   android:id="@+id/file_button1"
  25.                   android:layout_width="wrap_content"
  26.                       android:layout_height="wrap_content"
  27.                       android:text="清除file保存内容">
  28.         </Button>
  29.         <Button   android:id="@+id/file_button2"
  30.                   android:layout_width="wrap_content"
  31.                       android:layout_height="wrap_content"
  32.                       android:text="删除file文件">
  33.         </Button>
  34. </LinearLayout>
复制代码
3.在本地程序res/raw中读取数据操作

        Android 下提供了专门读取程序res/raw路径下资源的方法,但是没有提供写入raw内容的方法,也就是说只能读不能写,在做软件的时候有时须要读取大量的文字资源,由于这些资源文字在软件中不会改变所以无需去对它的内容重写修改,就可以使用raw来操作数据。


如图所示:在列表中读取.bin文件中的内容分别显示在listView中


9.gif 
        如图所示在raw路径下存了一个文件date0.bin ,下面是bin文件中保存的内容,程序中须要对这个.bin文件的内容进行读取并显示在屏幕中。
10.gif 



下面给出代码的实现
  1. public class loadRawActivity extends ListActivity {

  2.     private class MyListAdapter extends BaseAdapter {
  3.         private int[] colors = new int[] { 0xff626569, 0xff4f5257 };

  4.         public MyListAdapter(Context context) {
  5.             mContext = context;
  6.         }

  7.         public int getCount() {
  8.             return inpormation.length;
  9.         }

  10.         @Override
  11.         public boolean areAllItemsEnabled() {
  12.             return false;
  13.         }

  14.         public Object getItem(int position) {
  15.             return position;
  16.         }

  17.         public long getItemId(int position) {
  18.             return position;
  19.         }

  20.         public View getView(int position, View convertView, ViewGroup parent) {
  21.             TextView tv;
  22.             if (convertView == null) {
  23.                 tv = (TextView) LayoutInflater.from(mContext).inflate(
  24.                         android.R.layout.simple_list_item_1, parent, false);
  25.             } else {
  26.                 tv = (TextView) convertView;
  27.             }
  28.             int colorPos = position % colors.length;
  29.             tv.setBackgroundColor(colors[colorPos]);
  30.             tv.setText(String.valueOf(position + 1) + ":"
  31.                     + inpormation[position]);
  32.             return tv;
  33.         }

  34.         private Context mContext;
  35.     }

  36.     String[] inpormation = null;
  37.     ListView listView;

  38.     @Override
  39.     protected void onCreate(Bundle savedInstanceState) {
  40.         readFile(R.raw.date0);
  41.         setListAdapter(new MyListAdapter(this));
  42.         listView = getListView();
  43.         int[] colors = { 0, 0xFF505259, 0 }; 
  44.         listView
  45.                 .setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
  46.         listView.setDividerHeight(10);
  47.         super.onCreate(savedInstanceState);
  48.     }

  49.     /**
  50.      * 从raw中读取数据
  51.      * @param ID
  52.      */
  53.     public void readFile(int ID) {
  54.         InputStream in = null;
  55.         String temp = "";
  56.         try {
  57.             in = this.getResources().openRawResource(ID);
  58.             byte[] buff = new byte[1024];// 缓存
  59.             int rd = 0;
  60.             ByteArrayOutputStream baos = new ByteArrayOutputStream();
  61.             while ((rd = in.read(buff)) != -1) {
  62.                 baos.write(buff, 0, rd);
  63.                 temp = new String(baos.toByteArray(), "UTF-8");
  64.             }
  65.             baos.close();
  66.             in.close();
  67.             inpormation = temp.split("\r\n");
  68.         } catch (Exception e) {
  69.             Toast.makeText(this, "文件没有找到", 2000).show();
  70.         }
  71.     }

  72. }
复制代码
3.在SD卡中处理新建 写入 读取 删除 的操作

       可以把数据保存在SD卡中,在SD卡中建立一个文件去保存数据,这里说一下 ,SD卡 用户是可以访问的,也就是说可以把一些可有可无的数据存在SD卡中,即使用户删除了卡中的内容也不会影像软件的使用。
11.gif 
将文件在SD卡中删除
12.gif
  1. public class loadSDActivity extends Activity {
  2.     public final static String FILE_NAME = "b.txt";
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         setContentView(R.layout.sdfile);
  6.         /**读取内容**/
  7.         String content = loadFile();
  8.         if(content == null) {
  9.             content ="上次没有输入内容请输入"; 
  10.         }
  11.         
  12.         final EditText editContent = (EditText)findViewById(R.id.sdfile_et0);
  13.         editContent.setHint("上次输入SD卡的内容的为【 " +content + "】");
  14.         Button button0 = (Button)findViewById(R.id.sdfile_button0);
  15.         
  16.         /**监听按钮点击后保存用户输入信息到SD卡中**/
  17.         button0.setOnClickListener(new  OnClickListener() {
  18.             
  19.             @Override
  20.             public void onClick(View arg0) {
  21.                 /**拿到用户输入的信息**/
  22.                 String content = editContent.getText().toString();
  23.                 /**开始保存入SD卡**/
  24.                 saveFile(content);
  25.                 ShowDialog("保存SD卡文件成功");
  26.             }
  27.         });
  28.         Button button1 = (Button)findViewById(R.id.sdfile_button1);
  29.         
  30.         /**去清除SD卡保存的内容**/
  31.         button1.setOnClickListener(new  OnClickListener() {
  32.             @Override
  33.             public void onClick(View arg0) {
  34.                 cleanFile();
  35.                 ShowDialog("清除SD卡文件中的内容成功");
  36.             }
  37.         });        
  38.         Button button2 = (Button)findViewById(R.id.sdfile_button2);
  39.         
  40.         /**删除SD卡保存的文件**/
  41.         button2.setOnClickListener(new  OnClickListener() {
  42.             @Override
  43.             public void onClick(View arg0) {
  44.                 DeleteSDFile();
  45.             }
  46.         });
  47.         
  48.         super.onCreate(savedInstanceState);
  49.     }
  50.     
  51.     /**
  52.      * 保存入SD卡中
  53.      * @param str
  54.      */
  55.     public void saveFile(String str) {
  56.         FileOutputStream fileOutputStream = null;

  57.         File file = new File(Environment.getExternalStorageDirectory(),
  58.                 FILE_NAME);
  59.         try {
  60.             fileOutputStream = new FileOutputStream(file);
  61.             fileOutputStream.write(str.getBytes());
  62.             fileOutputStream.close();
  63.         } catch (FileNotFoundException e) {
  64.             e.printStackTrace();
  65.         }catch (IOException e) {
  66.             e.printStackTrace();
  67.         }
  68.     }
  69.    
  70.     
  71.     /**
  72.      * 读取SD卡的内容
  73.      * @return
  74.      */
  75.     public String loadFile() {
  76.         String path = Environment.getExternalStorageDirectory() +"/" + FILE_NAME;
  77.         try {

  78.             FileInputStream fi = new FileInputStream(path);
  79.             BufferedReader br = new BufferedReader(new InputStreamReader(
  80.                     fi));
  81.             String readString = new String();
  82.             while ((readString = br.readLine()) != null) {
  83.                 //数据多的话须要在这里处理 readString
  84.                 return readString;
  85.             }
  86.             fi.close();
  87.         } catch (FileNotFoundException e) {
  88.             e.printStackTrace();
  89.         } catch (IOException e) {
  90.             e.printStackTrace();
  91.         }

  92.         return null;
  93.     }
  94.     
  95.     /**
  96.      * 删除SD卡
  97.      */
  98.     public void DeleteSDFile() {
  99.         String path = Environment.getExternalStorageDirectory() + "/"
  100.                 + FILE_NAME;
  101.         File file1 = new File(path);
  102.         boolean isdelte = file1.delete();
  103.         if(isdelte) {
  104.             ShowDialog("删除SD卡成功");
  105.         }else {
  106.             finish();
  107.         }
  108.     }
  109.     
  110.     /**
  111.      * 因为java删除文件内容只有一种实现方法,就是把整个文件重写,只是把须要删除的那一条记录去除掉 
  112.      */
  113.     public void cleanFile() {
  114.         //如果只须要删除文件中的一部分内容则须要在这里对字符串做一些操作
  115.         String cleanStr = "";
  116.         FileOutputStream fileOutputStream = null;

  117.         File file = new File(Environment.getExternalStorageDirectory(),
  118.                 FILE_NAME);
  119.         try {
  120.             fileOutputStream = new FileOutputStream(file);
  121.             fileOutputStream.write(cleanStr.getBytes());
  122.             fileOutputStream.close();
  123.         } catch (FileNotFoundException e) {
  124.             e.printStackTrace();
  125.         }catch (IOException e) {
  126.             e.printStackTrace();
  127.         }
  128.     }
  129.     public void ShowDialog(String str) {
  130.         AlertDialog.Builder builder = new AlertDialog.Builder(loadSDActivity.this);
  131.         builder.setIcon(R.drawable.icon);
  132.         builder.setTitle(str);
  133.         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  134.             public void onClick(DialogInterface dialog, int whichButton) {
  135.                 finish();
  136.             }
  137.         });
  138.         builder.show();
  139.     }
  140. }
复制代码
  1. <?xml version="1.0" encoding="utf-8"?>

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.         android:layout_width="fill_parent" 
  4.         android:layout_height="fill_parent"
  5.         android:orientation="vertical"
  6.         >
  7.         <ImageView android:id="@+id/sdfile_image"
  8.                 android:layout_width="wrap_content"
  9.                  android:layout_height="wrap_content"
  10.                 android:src="@drawable/g"
  11.                 android:layout_gravity="center"
  12.                 />
  13.         <EditText android:id="@+id/sdfile_et0"
  14.                           android:layout_width="fill_parent"
  15.                       android:layout_height="wrap_content"
  16.                       android:hint="请输入需要保存到SD卡的内容">
  17.         </EditText>
  18.         <Button   android:id="@+id/sdfile_button0"
  19.                   android:layout_width="wrap_content"
  20.                       android:layout_height="wrap_content"
  21.                       android:text="保存输入内容到SD卡">
  22.         </Button>
  23.         <Button   android:id="@+id/sdfile_button1"
  24.                   android:layout_width="wrap_content"
  25.                       android:layout_height="wrap_content"
  26.                       android:text="清除SD卡保存文件的内容">
  27.         </Button>
  28.         <Button   android:id="@+id/sdfile_button2"
  29.                   android:layout_width="wrap_content"
  30.                       android:layout_height="wrap_content"
  31.                       android:text="删除SD卡中保存的文件">
  32.         </Button>
  33. </LinearLayout>
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值