一.Junit
    1.怎么使用
        在AndroidManifest.xml文件中进行配置, 在manifest借点下配置instrumentation, 在application借点下配置uses-library
        定义类继承AndroidTestCast
        定义测试方法, Run As JunitTest
        如果需要判断测试结果, 可以使用Assert.assertEquals()方法.

下面是利用独立的测试工程JunitTest来测试工程Junit:

  1. package com.shellway.junit;
  2.  
  3. public class Service {
  4. public int divide(int a,int b){
  5. return a/b;
  6. }
  7. }

Service.java

  1. package com.shellway.junit;
  2.  
  3. import junit.framework.Assert;
  4. import android.test.AndroidTestCase;
  5.  
  6. public class TestT extends AndroidTestCase {
  7. public void test1(){
  8. Service service = new Service();
  9. System.out.println(service.divide(10, 2));
  10. }
  11. public void test2(){
  12. Service service = new Service();
  13. System.out.println(service.divide(10, 0));
  14. }
  15. public void test3(){
  16. Service service = new Service();
  17. Assert.assertEquals(2.5, service.divide(10, 4));
  18. }
  19. }

TestT.java

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.shellway.junit"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="16"
  9. android:targetSdkVersion="21" />
  10. <instrumentation
  11. android:targetPackage="com.shellway.junit"
  12. android:name="android.test.InstrumentationTestRunner" />
  13.  
  14. <application
  15. android:allowBackup="true"
  16. android:icon="@drawable/ic_launcher"
  17. android:label="@string/app_name"
  18. android:theme="@style/AppTheme" >
  19. <uses-library android:name="android.test.runner" />
  20. <activity
  21. android:name=".MainActivity"
  22. android:label="@string/app_name" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. </application>
  29. </manifest>

AndroidManifest.xml

JunitTest工程中的:

  1. package com.shellway.junit.test;
  2.  
  3. import junit.framework.Assert;
  4.  
  5. import com.shellway.junit.Service;
  6.  
  7. import android.test.AndroidTestCase;
  8.  
  9. public class MyTest extends AndroidTestCase {
  10. public void test1(){
  11. Service service = new Service();
  12. System.out.println(service.divide(10,2));
  13. }
  14. public void test2(){
  15. Service service = new Service();
  16. System.out.println(service.divide(10, 0));
  17. }
  18. public void test3(){
  19. Service service = new Service();
  20. Assert.assertEquals(2.5, service.divide(10, 4));
  21. }
  22. }

MyTest.java

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.shellway.junit.test"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk android:minSdkVersion="16" />
  8.  
  9. <instrumentation
  10. android:name="android.test.InstrumentationTestRunner"
  11. android:targetPackage="com.shellway.junit" />
  12.  
  13. <application
  14. android:icon="@drawable/ic_launcher"
  15. android:label="@string/app_name" >
  16. <uses-library android:name="android.test.runner" />
  17. </application>
  18. </manifest>

AndroidManifest.xml

二.日志
    1.怎么使用
        Log.v(), d(), i(), w(), e()
        可以按级别输出日子信息, 可以指定Tag

  1. package com.example.logcat;
  2.  
  3. import android.test.AndroidTestCase;
  4. import android.util.Log;
  5.  
  6. public class LogTest extends AndroidTestCase {
  7. public void test1(){
  8. System.out.println("System.out");
  9. System.err.println("System.out");
  10. }
  11. public void test2(){
  12. Log.v("LogTest", "verbose");
  13. Log.d("LogTest", "debug");
  14. Log.i("LogTest", "info");
  15. Log.w("LogTest", "warning");
  16. Log.e("LogTest", "error");
  17. }
  18. }

LogTest.java

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.logcat"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="21" />
  10. <instrumentation
  11. android:targetPackage="com.example.logcat"
  12. android:name="android.test.InstrumentationTestRunner" />
  13.  
  14. <application
  15. android:allowBackup="true"
  16. android:icon="@drawable/ic_launcher"
  17. android:label="@string/app_name"
  18. android:theme="@style/AppTheme" >
  19. <uses-library android:name="android.test.runner" />
  20. <activity
  21. android:name=".MainActivity"
  22. android:label="@string/app_name" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. </application>
  29. </manifest>

AndroidManifest.xml

三.读写文件
    1.读写SD卡
        获取SD卡路径要使用Environment.getExternalStorageDirectory()
        最好在使用SD卡之前判断状态, Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
        写入SD卡需要权限, android.permission.WRITE_EXTERNAL_STORAGE

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context="com.shellway.output.MainActivity" >
  10.  
  11. <EditText
  12. android:id="@+id/nameET"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:hint="请输入文件名" />
  16.  
  17. <EditText
  18. android:id="@+id/contentET"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content"
  21. android:layout_below="@id/nameET"
  22. android:hint="请输入文件内容"
  23. android:inputType="textMultiLine"
  24. android:minLines="3" />
  25.  
  26. <Button
  27. android:id="@+id/sdcBT"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_below="@id/contentET"
  31. android:onClick="onClick"
  32. android:text="保存到SD卡" />
  33.  
  34. <Button
  35. android:id="@+id/romBT"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:layout_below="@id/contentET"
  39. android:layout_toRightOf="@id/sdcBT"
  40. android:onClick="onClick"
  41. android:text="保存到ROM" />
  42.  
  43. </RelativeLayout>

activity_main.xml

  1. package com.shellway.fileoutput01;
  2.  
  3. import com.shellway.service.FileService;
  4.  
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.os.Bundle;
  7. import android.os.Environment;
  8. import android.view.View;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11.  
  12. public class MainActivity extends ActionBarActivity {
  13.  
  14. private EditText editText1;
  15. private EditText editText2;
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. }
  22.  
  23. public void onClick(View view) {
  24. try {
  25. editText1 = (EditText) findViewById(R.id.nameET);
  26. editText2 = (EditText) findViewById(R.id.contentET);
  27. String name = editText1.getText().toString();
  28. String content = editText2.getText().toString();
  29.  
  30. FileService service = new FileService(this);
  31. switch (view.getId()) {
  32. case R.id.sdcBT:
  33. System.out.println("SD卡");
  34. //先判断SD的状态
  35. if (!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))) {
  36. Toast.makeText(getApplicationContext(), "SD卡状态异常,不能保存", Toast.LENGTH_SHORT);
  37. return;
  38. }
  39. service.saveToSDcard(name,content);
  40. break;
  41. case R.id.romBT:
  42. System.out.println("ROM");
  43. service.saveToROM(name,content);
  44. break;
  45. }
  46. Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. Toast.makeText(getApplicationContext(), "保存失败", Toast.LENGTH_SHORT).show();
  50. }
  51. }
  52. }

MainActivity.java

  1. package com.shellway.service;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6.  
  7. import android.content.Context;
  8. import android.os.Environment;
  9.  
  10. public class FileService {
  11. private Context context;
  12.  
  13. public FileService(Context context) {
  14. this.context = context;
  15. }
  16.  
  17. //有异常先抛出,给主程序catch
  18. public void saveToSDcard(String name, String content) throws Exception {
  19. //获取SD卡所在目录,这种方式兼容所有版本
  20. File file = new File(Environment.getExternalStorageDirectory(),name);
  21. //创建输出流,指向SD卡所在目录
  22. FileOutputStream fileOutputStream = new FileOutputStream(file);
  23. //写出文件内容,默认UTF-8
  24. fileOutputStream.write(content.getBytes());
  25. fileOutputStream.close();
  26.  
  27. System.out.println("总空间:"+file.getTotalSpace());
  28. System.out.println("剩余空间:"+file.getFreeSpace());
  29. }
  30.  
  31. public void saveToROM(String name, String content) throws Exception {
  32. /**
  33. * openFileOutput()方法只有在MainActivity可用,现在经过传它的构造函数过来,在这里再调用它
  34. * 现在openFileOutput()方法的作用是:它会在当前环境(即当前应用在所在的文件夹下)根据name创建一个输出流
  35. * 模式:MODE_PRIVATE。表示只有当前应用能访问这个文件,其它应用访问不了
  36. */
  37. FileOutputStream fos = context.openFileOutput(name, Context.MODE_APPEND);
  38. fos.write(content.getBytes());
  39. fos.close();
  40. //往手机上写内容不用申请权限,写入SD卡才要。
  41. }
  42. }

FileService.java

2.读写手机
        可以使用Context.openFileOutput(String, int)方法打开输出流
        指定文件名后会自动在当前应用所在文件夹下生成files文件夹, 在其中创建文件
        int参数是文件权限, 可以是使用Context下的常量进行设置,即:

第一个参数,代表文件名称,注意这里的文件名称不能包括任何的/或者/这种分隔符,
      只能是文件名 该文件会被保存在/data/data/应用名称/files/chenzheng_java.txt 。
      第二个参数,代表文件的操作模式 :
      MODE_PRIVATE 私有(只能创建它的应用访问) 重复写入时会文件覆盖
      MODE_APPEND 私有 重复写入时会在文件的末尾进行追加,而不是覆盖掉原来的文件
      MODE_WORLD_READABLE 公用 可读
      MODE_WORLD_WRITEABLE 公用 可读写

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="请您输入要保存的内容:"
  11. />
  12. <EditText
  13. android:id="@+id/addText"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:hint="请您在此处输入文件内容!"
  17. />
  18. <Button
  19. android:id="@+id/addButton"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="save"
  23. />
  24. <Button
  25. android:id="@+id/showButton"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:text="show"
  29. />
  30. <TextView
  31. android:id="@+id/showText"
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content"
  34. />
  35.  
  36. </LinearLayout>

AndroidManifest.xml

  1. package cn.com.file;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8.  
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.EditText;
  15. import android.widget.TextView;
  16. import android.widget.Toast;
  17.  
  18. public class FileTest extends Activity {
  19. private EditText editText;
  20. private TextView showTextView;
  21. // 要保存的文件名
  22. private String fileName = "chenzheng_java.txt";
  23.  
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.main);
  28. // 获取页面中的组件
  29. editText = (EditText) findViewById(R.id.addText);
  30. showTextView = (TextView) findViewById(R.id.showText);
  31. Button addButton = (Button) this.findViewById(R.id.addButton);
  32. Button showButton = (Button) this.findViewById(R.id.showButton);
  33. // 绑定单击事件
  34. addButton.setOnClickListener(listener);
  35. showButton.setOnClickListener(listener);
  36.  
  37. }
  38.  
  39. // 声明监听器
  40. private View.OnClickListener listener = new OnClickListener() {
  41. public void onClick(View v) {
  42. Button view = (Button) v;
  43. switch (view.getId()) {
  44. case R.id.addButton:
  45. save();
  46. break;
  47. case R.id.showButton:
  48. read();
  49. break;
  50.  
  51. }
  52.  
  53. }
  54.  
  55. };
  56.  
  57. /**
  58. *@author chenzheng_Java
  59. *保存用户输入的内容到文件
  60. */
  61. private void save() {
  62.  
  63. String content = editText.getText().toString();
  64. try {
  65. /* 根据用户提供的文件名,以及文件的应用模式,打开一个输出流.文件不存系统会为你创建一个的,
  66. * 至于为什么这个地方还有FileNotFoundException抛出,我也比较纳闷。在Context中是这样定义的
  67. * public abstract FileOutputStream openFileOutput(String name, int mode)
  68. * throws FileNotFoundException;
  69. * openFileOutput(String name, int mode);
  70. * 第一个参数,代表文件名称,注意这里的文件名称不能包括任何的/或者/这种分隔符,只能是文件名
  71. * 该文件会被保存在/data/data/应用名称/files/chenzheng_java.txt
  72. * 第二个参数,代表文件的操作模式
  73. * MODE_PRIVATE 私有(只能创建它的应用访问) 重复写入时会文件覆盖
  74. * MODE_APPEND 私有 重复写入时会在文件的末尾进行追加,而不是覆盖掉原来的文件
  75. * MODE_WORLD_READABLE 公用 可读
  76. * MODE_WORLD_WRITEABLE 公用 可读写
  77. * */
  78. FileOutputStream outputStream = openFileOutput(fileName,
  79. Activity.MODE_PRIVATE);
  80. outputStream.write(content.getBytes());
  81. outputStream.flush();
  82. outputStream.close();
  83. Toast.makeText(FileTest.this, "保存成功", Toast.LENGTH_LONG).show();
  84. } catch (FileNotFoundException e) {
  85. e.printStackTrace();
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89.  
  90. }
  91.  
  92. /**
  93. * @author chenzheng_java
  94. * 读取刚才用户保存的内容
  95. */
  96. private void read() {
  97. try {
  98. FileInputStream inputStream = this.openFileInput(fileName);
  99. byte[] bytes = new byte[1024];
  100. ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
  101. while (inputStream.read(bytes) != -1) {
  102. arrayOutputStream.write(bytes, 0, bytes.length);
  103. }
  104. inputStream.close();
  105. arrayOutputStream.close();
  106. String content = new String(arrayOutputStream.toByteArray());
  107. showTextView.setText(content);
  108.  
  109. } catch (FileNotFoundException e) {
  110. e.printStackTrace();
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. }
  114.  
  115. }
  116.  
  117. }

FileTest.java

结果图:

对于这个程序,重要的是context为我们提供了两个方法来获取输入输出流。

四.SharedPreferences
    1.什么是SharedPreferences
        是一个键值对结构的容器, 类似于Map(Properties), 可以向其中存储键值对, 根据键查找值, 存储在容器中的数据会以xml文件形式保存.
    2.怎么使用
        使用Context.getSharedPreferences(String, int)获取对象, 指定文件名和文件模式
        使用SharedPreferences.edit()方法获取编辑器Editor
        使用Editor.putString(), putInt()等方法存储数据
        使用Editor.commit()方法提交修改(类似事务)
        获取的时候直接使用 SharedPreferences.getString(), getInt()等方法获取数据

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:orientation="vertical" >
  5.  
  6. <TextView
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:text="姓名" />
  10. <EditText
  11. android:id="@+id/nameET"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. >
  15. <requestFocus />
  16. </EditText>
  17.  
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="电话" />
  22. <EditText
  23. android:id="@+id/phoneET"
  24. android:layout_width="fill_parent"
  25. android:layout_height="wrap_content"
  26. />
  27.  
  28. <TextView
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:text="邮箱" />
  32. <EditText
  33. android:id="@+id/emailET"
  34. android:layout_width="fill_parent"
  35. android:layout_height="wrap_content"
  36. />
  37.  
  38. <Button
  39. android:id="@+id/button1"
  40. android:layout_width="wrap_content"
  41. android:layout_height="wrap_content"
  42. android:onClick="onClick"
  43. android:text="保存为默认" />
  44.  
  45. </LinearLayout>

activity_main.xml

  1. package com.shellway.sp;
  2.  
  3. import android.support.v7.app.ActionBarActivity;
  4. import android.content.SharedPreferences;
  5. import android.content.SharedPreferences.Editor;
  6. import android.os.Bundle;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.view.View;
  10. import android.widget.EditText;
  11.  
  12. public class MainActivity extends ActionBarActivity {
  13.  
  14. private EditText nameET;
  15. private EditText phoneET;
  16. private EditText emailET;
  17. private SharedPreferences sp;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. //获取文本信息
  24. nameET = (EditText) findViewById(R.id.nameET);
  25. phoneET = (EditText) findViewById(R.id.phoneET);
  26. emailET = (EditText) findViewById(R.id.emailET);
  27. //获取对象,默认指定当前应用,文件名为data.xml.模式为私有
  28. sp = getSharedPreferences("data", MODE_PRIVATE);
  29. nameET.setText(sp.getString("name", ""));
  30. phoneET.setText(sp.getString("phone", ""));
  31. emailET.setText(sp.getString("email", ""));
  32. }
  33.  
  34. public void onClick(View view){
  35. String name = nameET.getText().toString();
  36. String phone = phoneET.getText().toString();
  37. String email = emailET.getText().toString();
  38. Editor editor = sp.edit();//获取编辑器
  39. editor.putString("name", name);//存储数据(还没进入文件)
  40. editor.putString("phone", phone);
  41. editor.putString("email", email);
  42. editor.commit(); //提交修改(类似事务)
  43. }
  44. }

MainActivity.java

五.XML
    1.解析
        获取解析器: Xml.newPullParser()
        设置输入流: parser.setInput(InputStream, String)
        获取当前事件类型: parser.getEventType(), 共5种
        获取下一个事件类型: parser.next()
        获取标签名: parser.getName()
        获取属性值: parser.getAttributeValue(int)
        获取下一个文本: parser.nextText()
    2.生成
        获取解析器:
        设置输出流:
        开始文档:
        结束文档:
        开启标签:
        结束标签:
        设置属性:
        设置文本:

练习:

  1. <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
  2. <persons>
  3. <person id="1">
  4. <name>范冰冰</name>
  5. <age>31</age>
  6. </person>
  7. <person id="2">
  8. <name>林志玲</name>
  9. <age>38</age>
  10. </person>
  11. <person id="3">
  12. <name>杨幂</name>
  13. <age>26</age>
  14. </person>
  15. </persons>

persons.xml

  1. package com.shellway.xml;
  2.  
  3. public class Persons {
  4. private Integer id;
  5. private String name;
  6. private Integer age;
  7.  
  8. public Persons() {
  9. super();
  10. }
  11.  
  12. public Persons(Integer id, String name, Integer age) {
  13. super();
  14. this.id = id;
  15. this.name = name;
  16. this.age = age;
  17. }
  18.  
  19. public Integer getId() {
  20. return id;
  21. }
  22. public void setId(Integer id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public Integer getAge() {
  32. return age;
  33. }
  34. public void setAge(Integer age) {
  35. this.age = age;
  36. }
  37.  
  38. @Override
  39. public String toString() {
  40. return "Persons [id=" + id + ", name=" + name + ", age=" + age + "]";
  41. }
  42. }

persons.java

  1. package com.shellway.xml;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8.  
  9. import org.xmlpull.v1.XmlPullParser;
  10. import org.xmlpull.v1.XmlPullParserException;
  11. import org.xmlpull.v1.XmlSerializer;
  12.  
  13. import android.util.Xml;
  14.  
  15. public class PersonService {
  16.  
  17. public List<Persons> loadPerson(InputStream in) throws Exception{
  18. List<Persons> list = new ArrayList<Persons>();
  19. XmlPullParser paser = Xml.newPullParser();
  20. paser.setInput(in, "utf-8");
  21. Persons p = null;
  22. for (int type =paser.getEventType(); type!=XmlPullParser.END_DOCUMENT; type=paser.next()) {
  23. if (type == XmlPullParser.START_TAG) {
  24. if (paser.getName().equals("person")) {
  25. p = new Persons();
  26. String id = paser.getAttributeValue(null, "id");
  27. p.setId(Integer.parseInt(id));
  28. list.add(p);
  29. } else if (paser.getName().equals("name")) {
  30. String name = paser.nextText();
  31. p.setName(name);
  32. }else if (paser.getName().equals("age")) {
  33. String age = paser.nextText();
  34. p.setAge(Integer.parseInt(age));
  35. }
  36.  
  37. }
  38. }
  39.  
  40. return list;
  41. }
  42.  
  43. public void savePerson(List<Persons> persons,FileOutputStream fileOutputStream) throws Exception {
  44.  
  45. XmlSerializer xmlSerializer = Xml.newSerializer();
  46. xmlSerializer.setOutput(fileOutputStream, "utf-8");
  47. xmlSerializer.startDocument("utf-8", true);
  48. xmlSerializer.startTag(null, "persons");
  49. for (Persons p : persons) {
  50. xmlSerializer.startTag(null, "person");
  51. xmlSerializer.attribute(null, "id", p.getId().toString());
  52. xmlSerializer.endTag(null, "person");
  53.  
  54. xmlSerializer.startTag(null, "name");
  55. xmlSerializer.text(p.getName());
  56. xmlSerializer.endTag(null, "name");
  57.  
  58. xmlSerializer.startTag(null, "age");
  59. xmlSerializer.text(p.getAge().toString());
  60. xmlSerializer.endTag(null, "age");
  61. }
  62. xmlSerializer.endTag(null, "persons");
  63. xmlSerializer.endDocument();
  64. }
  65. }

PersonService.java

  1. package com.shellway.xml;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.util.List;
  6.  
  7. import android.test.AndroidTestCase;
  8.  
  9. public class TestPerson extends AndroidTestCase {
  10. public void testLoad() throws Exception{
  11. PersonService personService = new PersonService();
  12. InputStream in = this.getClass().getClassLoader().getResourceAsStream("persons.xml");
  13. List<Persons> persons = personService.loadPerson(in);
  14. for (Persons person : persons) {
  15. System.out.println(person);
  16. }
  17.  
  18. Persons person = new Persons(4,"shellway",25);
  19. persons.add(person);
  20. personService.savePerson(persons,new FileOutputStream("/mnt/sdcard/person.xml") );
  21.  
  22. }
  23. }

TestPerson.java

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.shellway.xml"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="21" />
  10.  
  11. <instrumentation
  12. android:targetPackage="com.shellway.xml"
  13. android:name="android.test.InstrumentationTestRunner" />
  14. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  15.  
  16. <application
  17. android:allowBackup="true"
  18. android:icon="@drawable/ic_launcher"
  19. android:label="@string/app_name"
  20. android:theme="@style/AppTheme" >
  21. <uses-library android:name="android.test.runner" />
  22. <activity
  23. android:name=".MainActivity"
  24. android:label="@string/app_name" >
  25. <intent-filter>
  26. <action android:name="android.intent.action.MAIN" />
  27. <category android:name="android.intent.category.LAUNCHER" />
  28. </intent-filter>
  29. </activity>
  30. </application>
  31.  
  32. </manifest>

AndroidManifest.xml

六.SQLite数据库
    1.SQLite数据库的特点
        手机自带的数据库, 不区分数据类型(除了主键), 语法和MySQL相同, 每个库是一个文件
    2.创建库
        定义类继承SQLiteOpenHelper, 定义构造函数, 显式调用父类构造函数, 传入4个参数
        重写onCreate()和onUpgrade()方法
        调用getWritableDatabase()或者getReadableDatabase()方法都可以创建数据库
        数据库文件不存在时, 会创建数据库文件, 并且执行onCreate()方法
        数据库文件存在, 并且版本没有改变时, 不执行任何方法
        数据库文件存在, 版本提升, 执行onUpgrade()方法
    3.增删改查
        增删改都可以使用SQLiteDatabase.execSQL()方法执行SQL语句完成
        查询方法需要使用SQLiteDatabase.rawQuery()方法进行查询, 得到一个Cursor, 再调用moveToNext()和getString()getInt()等方法获取数据

  1. package com.shellway.sqlite;
  2.  
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6.  
  7. public class DBSQLiteHelper extends SQLiteOpenHelper {
  8. public DBSQLiteHelper(Context context){
  9. super(context,"data.db" , null, 4);
  10. /**
  11. * 由于弗雷没有无参的构造函数,必须显式调用有参的构造函数
  12. * 参数1:上下文环境,用来确定数据库文件存储的目录
  13. * 参数2:数据库文件的名字
  14. * 参数3:生成游标的工厂,填null就是使用默认的
  15. * 参数4:数据库的版本,从1开始
  16. */
  17. }
  18.  
  19. @Override
  20. public void onCreate(SQLiteDatabase db) {
  21. System.out.println("onCreate");
  22. db.execSQL("CREATE TABLE people(id INTEGER PRIMARY KEY AUTOINCREMENT,name VACHAR(20))");
  23. }
  24.  
  25. @Override
  26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  27. System.out.println("onUpgrade");
  28. db.execSQL("ALTER TABLE people ADD balance INTEGER");
  29. }
  30. }

DBSQLiteHelper

  1. package com.shellway.sqlite;
  2.  
  3. public class Person {
  4.  
  5. private Integer id;
  6. private String name;
  7. private Integer balance;
  8. public Person() {
  9. super();
  10. }
  11. public Person(String name, Integer balance) {
  12. super();
  13. this.name = name;
  14. this.balance = balance;
  15. }
  16. public Person(Integer id, String name, Integer balance) {
  17. super();
  18. this.id = id;
  19. this.name = name;
  20. this.balance = balance;
  21. }
  22. public Integer getId() {
  23. return id;
  24. }
  25. public void setId(Integer id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public Integer getBalance() {
  35. return balance;
  36. }
  37. public void setBalance(Integer balance) {
  38. this.balance = balance;
  39. }
  40. @Override
  41. public String toString() {
  42. return "person [id=" + id + ", name=" + name + ", balance=" + balance
  43. + "]";
  44. }
  45. }

Person

  1. package com.shellway.sqlite;
  2.  
  3. import android.content.Context;
  4. import android.database.Cursor;
  5. import android.database.sqlite.SQLiteDatabase;
  6.  
  7. public class PersonDAO {
  8. private DBSQLiteHelper helper;
  9.  
  10. public PersonDAO(Context context) {
  11. helper = new DBSQLiteHelper(context);
  12. }
  13.  
  14. public void insert(Person p){
  15. SQLiteDatabase db = helper.getWritableDatabase();//获取数据库链接(可写的)
  16. db.execSQL("INSERT INTO people(name,balance) VALUES(?,?)", new Object[]{p.getName(),p.getBalance()} );
  17. db.close();
  18. }
  19. public void delete(Integer id){
  20. SQLiteDatabase db = helper.getWritableDatabase();
  21. db.execSQL("DELETE FROM people WHERE id = ?", new Object[]{id});
  22. db.close();
  23. }
  24. public void update(Person p){
  25. SQLiteDatabase db = helper.getWritableDatabase();
  26. db.execSQL("update people set name=?,balance=? where id=? ", new Object[]{p.getName(),p.getBalance(),p.getId()});
  27. db.close();
  28. }
  29. public Person query(Integer id){
  30. /**
  31. * 查询时候应该优先使用getReadableDatabase()而不是getWritableDatabase(),
  32. * 其实getReadableDatabase是先获取getWritableDatabase,若获取失败则采用getReadableDatabase
  33. */
  34. SQLiteDatabase db = helper.getReadableDatabase();
  35. Cursor c = db.rawQuery("select name,balance from people where id=?",new String[]{id+""});
  36. Person p = null ;
  37. if (c.moveToNext()) {
  38. String name = c.getString(c.getColumnIndex("name"));
  39. int balance = c.getInt(1);//若直接用下标方式,则注意该字段的索引,游标的索引是从0开始的
  40. p = new Person(id,name,balance);
  41. }
  42. c.close();
  43. db.close();
  44. return p;
  45. }
  46. }

PersonDAO

  1. package com.shellway.sqlite;
  2.  
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.provider.SyncStateContract.Helpers;
  5. import android.test.AndroidTestCase;
  6.  
  7. public class TestSQLite extends AndroidTestCase {
  8. public void test1(){
  9. DBSQLiteHelper helper = new DBSQLiteHelper(getContext());
  10. SQLiteDatabase sql = helper.getWritableDatabase();
  11. /**
  12. * 获取可写的数据库连接
  13. * 数据库文件不存在时,会创建数据库文件,并且执行onCreate()方法
  14. * 数据库文件存在,且版本没有改变时,不执行任何方法
  15. * 数据库文件存在,版本提升,执行onUpdate方法
  16. */
  17. }
  18. public void testInsert(){
  19. PersonDAO personDAO = new PersonDAO(getContext());
  20. personDAO.insert(new Person("Jerry",20000));
  21. }
  22. public void testDelete(){
  23. PersonDAO personDAO = new PersonDAO(getContext());
  24. personDAO.delete(2);
  25. }
  26. public void testUpdate(){
  27. PersonDAO personDAO = new PersonDAO(getContext());
  28. personDAO.update(new Person(1,"www",30000));
  29. }
  30. public void testQuery(){
  31. PersonDAO personDAO = new PersonDAO(getContext());
  32. System.out.println(personDAO.query(1));
  33. }
  34. }

TestSQLite

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.shellway.sqlite"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="21" />
  10. <instrumentation
  11. android:targetPackage="com.shellway.sqlite"
  12. android:name="android.test.InstrumentationTestRunner" />
  13.  
  14. <application
  15. android:allowBackup="true"
  16. android:icon="@drawable/ic_launcher"
  17. android:label="@string/app_name"
  18. android:theme="@style/AppTheme" >
  19. <uses-library android:name="android.test.runner" />
  20. <activity
  21. android:name=".MainActivity"
  22. android:label="@string/app_name" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. </application>
  29.  
  30. </manifest>

AndroidManifest.xml

查询所有, 查询个数, 查询翻页:

  1. package com.shellway.sqlite;
  2.  
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6.  
  7. public class DBSQLiteHelper extends SQLiteOpenHelper {
  8. public DBSQLiteHelper(Context context){
  9. super(context,"data.db" , null, 4);
  10. /**
  11. * 由于弗雷没有无参的构造函数,必须显式调用有参的构造函数
  12. * 参数1:上下文环境,用来确定数据库文件存储的目录
  13. * 参数2:数据库文件的名字
  14. * 参数3:生成游标的工厂,填null就是使用默认的
  15. * 参数4:数据库的版本,从1开始
  16. */
  17. }
  18.  
  19. @Override
  20. public void onCreate(SQLiteDatabase db) {
  21. System.out.println("onCreate");
  22. db.execSQL("CREATE TABLE people(id INTEGER PRIMARY KEY AUTOINCREMENT,name VACHAR(20))");
  23. }
  24.  
  25. @Override
  26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  27. System.out.println("onUpgrade");
  28. db.execSQL("ALTER TABLE people ADD balance INTEGER");
  29. }
  30. }

DBSQLiteHelper

  1. package com.shellway.sqlite;
  2.  
  3. public class Person {
  4.  
  5. private Integer id;
  6. private String name;
  7. private Integer balance;
  8. public Person() {
  9. super();
  10. }
  11. public Person(String name, Integer balance) {
  12. super();
  13. this.name = name;
  14. this.balance = balance;
  15. }
  16. public Person(Integer id, String name, Integer balance) {
  17. super();
  18. this.id = id;
  19. this.name = name;
  20. this.balance = balance;
  21. }
  22. public Integer getId() {
  23. return id;
  24. }
  25. public void setId(Integer id) {
  26. this.id = id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public Integer getBalance() {
  35. return balance;
  36. }
  37. public void setBalance(Integer balance) {
  38. this.balance = balance;
  39. }
  40. @Override
  41. public String toString() {
  42. return "person [id=" + id + ", name=" + name + ", balance=" + balance
  43. + "]";
  44. }
  45. }

Person

  1. package com.shellway.sqlite;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.content.Context;
  7. import android.database.Cursor;
  8. import android.database.sqlite.SQLiteDatabase;
  9.  
  10. public class PersonDAO {
  11. private DBSQLiteHelper helper;
  12.  
  13. public PersonDAO(Context context) {
  14. helper = new DBSQLiteHelper(context);
  15. }
  16.  
  17. public void insert(Person p){
  18. SQLiteDatabase db = helper.getWritableDatabase();//获取数据库链接(可写的)
  19. db.execSQL("INSERT INTO people(name,balance) VALUES(?,?)", new Object[]{p.getName(),p.getBalance()} );
  20. db.close();
  21. }
  22. public void delete(Integer id){
  23. SQLiteDatabase db = helper.getWritableDatabase();
  24. db.execSQL("DELETE FROM people WHERE id = ?", new Object[]{id});
  25. db.close();
  26. }
  27. public void update(Person p){
  28. SQLiteDatabase db = helper.getWritableDatabase();
  29. db.execSQL("update people set name=?,balance=? where id=? ", new Object[]{p.getName(),p.getBalance(),p.getId()});
  30. db.close();
  31. }
  32. //根据id查询某条记录
  33. public Person query(Integer id){
  34. /**
  35. * 查询时候应该优先使用getReadableDatabase()而不是getWritableDatabase(),
  36. * 其实getReadableDatabase是先获取getWritableDatabase,若获取失败则采用getReadableDatabase
  37. */
  38. SQLiteDatabase db = helper.getReadableDatabase();
  39. Cursor c = db.rawQuery("select name,balance from people where id=?",new String[]{id+""});
  40. Person p = null ;
  41. if (c.moveToNext()) {
  42. String name = c.getString(c.getColumnIndex("name"));
  43. int balance = c.getInt(1);//若直接用下标方式,则注意该字段的索引,游标的索引是从0开始的
  44. p = new Person(id,name,balance);
  45. }
  46. c.close();
  47. db.close();
  48. return p;
  49. }
  50. //查询全部记录
  51. public List<Person> findAll(){
  52. SQLiteDatabase db = helper.getReadableDatabase();
  53. Cursor c = db.rawQuery("select id,name,balance from people", null);
  54. List<Person> persons = new ArrayList<Person>();
  55. while (c.moveToNext()) {
  56. Person p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
  57. persons.add(p);
  58. }
  59. c.close();
  60. db.close();
  61. return persons;
  62. }
  63. //查询记录总条数
  64. public int queryCount(){
  65. SQLiteDatabase db = helper.getReadableDatabase();
  66. Cursor c = db.rawQuery("select count(*) from people", null);
  67. c.moveToNext();
  68. int i = c.getInt(0);
  69. c.close();
  70. db.close();
  71. return i;
  72. }
  73. //分页查询
  74. public List<Person> queryPage(int pageNum,int capacity){
  75. String offset = (pageNum-1) * capacity +""; //偏移量,即是第几页的页数
  76. String len = capacity + ""; //一页中显示的个数
  77. SQLiteDatabase db = helper.getReadableDatabase();
  78. Cursor c = db.rawQuery("select id,name,balance from people limit ?,?", new String[]{offset,len});
  79. List<Person> persons = new ArrayList<Person>();
  80. while (c.moveToNext()) {
  81. Person p = new Person(c.getInt(0),c.getString(1),c.getInt(2));
  82. persons.add(p);
  83. }
  84. c.close();
  85. db.close();
  86. return persons;
  87. }
  88. }

PersonDAO

  1. package com.shellway.sqlite;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6.  
  7. import android.database.sqlite.SQLiteDatabase;
  8. import android.provider.SyncStateContract.Helpers;
  9. import android.test.AndroidTestCase;
  10.  
  11. public class TestSQLite extends AndroidTestCase {
  12. public void test1(){
  13. DBSQLiteHelper helper = new DBSQLiteHelper(getContext());
  14. SQLiteDatabase sql = helper.getWritableDatabase();
  15. /**
  16. * 获取可写的数据库连接
  17. * 数据库文件不存在时,会创建数据库文件,并且执行onCreate()方法
  18. * 数据库文件存在,且版本没有改变时,不执行任何方法
  19. * 数据库文件存在,版本提升,执行onUpdate方法
  20. */
  21. }
  22. public void testInsert(){
  23. PersonDAO personDAO = new PersonDAO(getContext());
  24. // personDAO.insert(new Person("Jerry",20000));
  25. for (int i = 1; i <=100; i++) {
  26. personDAO.insert(new Person("Test"+i,new Random().nextInt(10000)));
  27. }
  28. }
  29. public void testDelete(){
  30. PersonDAO personDAO = new PersonDAO(getContext());
  31. personDAO.delete(2);
  32. }
  33. public void testUpdate(){
  34. PersonDAO personDAO = new PersonDAO(getContext());
  35. personDAO.update(new Person(1,"www",30000));
  36. }
  37. public void testQuery(){
  38. PersonDAO personDAO = new PersonDAO(getContext());
  39. System.out.println(personDAO.query(1));
  40. }
  41. public void testFindAll(){
  42. PersonDAO personDAO = new PersonDAO(getContext());
  43. List<Person> persons = personDAO.findAll();
  44. for (Person p : persons) {
  45. System.out.println(p);
  46. }
  47. }
  48. public void testQueryCount(){
  49. PersonDAO personDAO = new PersonDAO(getContext());
  50. int count = personDAO.queryCount();
  51. System.out.println(count);
  52. }
  53. public void testQueryPage(){
  54. PersonDAO personDAO = new PersonDAO(getContext());
  55. List<Person> persons = personDAO.queryPage(3, 20);
  56. for (Person p : persons) {
  57. System.out.println(p);
  58. }
  59. }
  60.  
  61. }

TestSQLite

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.shellway.sqlite"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="21" />
  10. <instrumentation
  11. android:targetPackage="com.shellway.sqlite"
  12. android:name="android.test.InstrumentationTestRunner" />
  13.  
  14. <application
  15. android:allowBackup="true"
  16. android:icon="@drawable/ic_launcher"
  17. android:label="@string/app_name"
  18. android:theme="@style/AppTheme" >
  19. <uses-library android:name="android.test.runner" />
  20. <activity
  21. android:name=".MainActivity"
  22. android:label="@string/app_name" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. </application>
  29.  
  30. </manifest>

AndroidManifest.xml

查询分页结果:

java攻城狮之路(Android篇)--SQLite的更多相关文章

  1. java攻城狮之路(Android篇)--BroadcastReceiver&Service

    四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...

  2. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...

  3. java攻城狮之路(Android篇)--Activity生命

    一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...

  4. java攻城狮之路(Android篇)--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...

  5. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

  6. java攻城狮之路(Android篇)--与服务器交互

    一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...

  7. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  8. java攻城狮之路--复习xml&dom_pull编程续

    本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...

  9. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

随机推荐

  1. paip.解决 数据库mysql增加列 字段很慢添加字段很慢

    paip.解决 数据库mysql增加列 字段很慢添加字段很慢 #环境如下: mysql5.6    数据仅仅3w alter table xxx add column yyy int default ...

  2. JAVA学习Swing章节按钮组件JButton的简单学习

    package com.swing; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; ...

  3. 为ubuntu操作系统增加root用户

    1:当安装好虚拟机,安装好Ubuntu操作系统后,登陆的时候发现除了自己的设置的用户就是外来用户,其实Ubuntu中的root帐号默认是被禁用了的,所以登陆的时候没有这个账号,但是如果每次使用root ...

  4. JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  5. php对csv文件的读取,写入,输出下载操作

    在实际工作中,很多时候需要把网站上的一些数据下载到CSV文件里,方便以后查看. 亦或者是用CSV进行一些批量的上传工作. 这个时候我们就需要对CSV进行读写操作. 1.CSV的读取操作 <?ph ...

  6. Nginx缓存、压缩配置

    1.缓存配置 只需在http的server模块里配置即可,如: location ~.*\.(jpg|png|gif)$ { expires 30d; } location ~.*\.(css|js) ...

  7. 转:MPlayer源代码分析

    一.Mplayer支持的格式 MPlayer是一个LINUX下的视频播放器,它支持相当多的媒体格式,无论在音频播放还是在视频播放方面,可以说它支持的格式是相当全面的. 视频格式支持:MPEG.AVI. ...

  8. Oracle中的索引详解

    Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是 ...

  9. 解决方案: scp/ssh 的登陆提示很慢 (Linux)

    看着用 windows 的 scp 命令很快很是羡慕. 这个问题让我实实郁闷了好几天. 在 Linux 下不管是用 ssh 还是用 scp, 连接速度都很慢 (登陆提示框的弹出时间). 确切地讲, 每 ...

  10. (转)c#.net常用字符串函数

    Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 CompareOrdinal 与Compare一样,但不考虑文化背景 Format 格式化包含各种值的字符串和如何格式化每 ...