使用 SQLiteDatabase 操作 SQLite 数据库

[java] view
plain
copy

  1. /*
  2. Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。 execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
  3. execSQL()方法的使用例子:
  4. SQLiteDatabase db = ....;
  5. db.execSQL("insert into person(name, age) values('测试数据', 4)");
  6. db.close();
  7. 执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“测试数据”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
  8. SQLiteDatabase db = ....;
  9. db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"测试数据", 4});
  10. db.close();
  11. execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
  12. */

[java] view
plain
copy

  1. public class DatabaseHelper extends SQLiteOpenHelper {
  2. //类没有实例化,是不能用作父类构造器的参数,必须声明为静态
  3. private static final String name = "itcast"; //数据库名称
  4. private static final int version = 1; //数据库版本
  5. public DatabaseHelper(Context context) {
  6. //第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
  7. super(context, name, null, version);
  8. }
  9. @Override public void onCreate(SQLiteDatabase db) {
  10. db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
  11. }
  12. @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  13. db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
  14. // DROP TABLE IF EXISTS person 删除表
  15. }
  16. }
  17. //在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数//据库中的数据丢失。

[java] view
plain
copy

  1. /*
  2. Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。 execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
  3. execSQL()方法的使用例子:
  4. SQLiteDatabase db = ....;
  5. db.execSQL("insert into person(name, age) values('测试数据', 4)");
  6. db.close();
  7. 执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“测试数据”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:
  8. SQLiteDatabase db = ....;
  9. db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"测试数据", 4});
  10. db.close();
  11. execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。
  12. */

[java] view
plain
copy

  1. /*
  2. SQLiteDatabase的rawQuery() 用于执行select语句,使用例子如下:  SQLiteDatabase db = ....;
  3. Cursor cursor = db.rawQuery(“select * from person”, null);
  4. while (cursor.moveToNext()) {
  5. int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
  6. String name = cursor.getString(1);//获取第二列的值
  7. int age = cursor.getInt(2);//获取第三列的值
  8. }
  9. cursor.close();
  10. db.close();
  11. rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:
  12. Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%传智%", "4"});
  13. Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。
  14. */

[java] view
plain
copy

  1. /*
  2. 除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。
  3. Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放。 ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法,  key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。
  4. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  5. ContentValues values = new ContentValues();
  6. values.put("name", "测试数据");
  7. values.put("age", 4);
  8. long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关
  9. 不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为Null的记录。Insert()方法内部实际上通过构造insert SQL语句完成数据的添加,Insert()方法的第二个参数用于指定空值字段的名称,相信大家对该参数会感到疑惑,该参数的作用是什么?是这样的:如果第三个参数values 为Null或者元素个数为0, 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要, insert语句必须给定一个字段名,如:insert into person(name) values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,执行类似insert into person(personid) values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
  10. */

[java] view
plain
copy

  1. /*
  2. delete()方法的使用:
  3. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  4. db.delete("person", "personid<?", new String[]{"2"});
  5. db.close();
  6. 上面代码用于从person表中删除personid小于2的记录。
  7. update()方法的使用:
  8. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  9. ContentValues values = new ContentValues();
  10. values.put(“name”, “测试数据”);//key为字段名,value为值
  11. db.update("person", values, "personid=?", new String[]{"1"});
  12. db.close();
  13. 上面代码用于把person表中personid等于1的记录的name字段的值改为“测试数据”。
  14. */

[java] view
plain
copy

  1. /*
  2. query()方法实际上是把select语句拆分成了若干个组成部分,然后作为方法的输入参数:
  3. SQLiteDatabase db = databaseHelper.getWritableDatabase();
  4. Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%传智%"}, null, null, "personid desc", "1,2");
  5. while (cursor.moveToNext()) {
  6. int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
  7. String name = cursor.getString(1);//获取第二列的值
  8. int age = cursor.getInt(2);//获取第三列的值
  9. }
  10. cursor.close();
  11. db.close();
  12. 上面代码用于从person表中查找name字段含有“传智”的记录,匹配的记录按personid降序排序,对排序后的结果略过第一条记录,只获取2条记录。
  13. query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
  14. table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
  15. columns:要查询出来的列名。相当于select语句select关键字后面的部分。
  16. selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
  17. selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
  18. groupBy:相当于select语句group by关键字后面的部分
  19. having:相当于select语句having关键字后面的部分
  20. orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
  21. limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。
  22. */

[java] view
plain
copy

  1. package com.zyq.db;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class MainActivity extends Activity
  5. {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState)
  8. {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. }
  12. }

[java] view
plain
copy

  1. package com.zyq.db;
  2. import java.util.List;
  3. import android.test.AndroidTestCase;
  4. import android.util.Log;
  5. import com.zyq.service.DBOpenHelper;
  6. import com.zyq.service.PersonService;
  7. import com.zyq.voo.Person;
  8. /**
  9. * 测试方法 通过Junit 单元测试
  10. * 1.>实例化测试类
  11. * 2.>把与应用有关的上下文信息传入到测试类实例
  12. * 3.>运行测试方法
  13. * @author Administrator
  14. *
  15. */
  16. public class PersonServiceTest extends AndroidTestCase
  17. {
  18. private final static String TAG="PersonServiceTest";
  19. /**
  20. * 测试创建数据库
  21. * @throws Throwable
  22. */
  23. public void testCreateDB() throws Throwable
  24. {
  25. DBOpenHelper dbOpenHelper=new DBOpenHelper(this.getContext());
  26. dbOpenHelper.getReadableDatabase(); //Create and/or open a database.
  27. }
  28. /**
  29. * 测试新增一条记录
  30. * @throws Throwable
  31. */
  32. public void testSave() throws Throwable
  33. {
  34. PersonService personService=new PersonService(this.getContext());
  35. personService.save(new Person("zhangsan","1360215320"));
  36. personService.save(new Person("lisi","1123"));
  37. personService.save(new Person("lili","232"));
  38. personService.save(new Person("wangda","123123"));
  39. personService.save(new Person("laozhu","234532"));
  40. }
  41. /**
  42. * 查找一条记录
  43. * @throws Throwable
  44. */
  45. public void testFind() throws Throwable
  46. {
  47. PersonService personService=new PersonService(this.getContext());
  48. Person person=personService.find(1);
  49. Log.i(TAG,person.toString());
  50. }
  51. /**
  52. * 测试更新一条记录
  53. * @throws Throwable
  54. */
  55. public void testUpdate() throws Throwable
  56. {
  57. PersonService personService=new PersonService(this.getContext());
  58. Person person=personService.find(1);
  59. person.setName("lisi");
  60. personService.update(person);
  61. }
  62. /**
  63. * 测试得到所有记录数
  64. * @throws Throwable
  65. */
  66. public void testGetCount() throws Throwable
  67. {
  68. PersonService personService=new PersonService(this.getContext());
  69. Log.i(TAG, personService.getCount()+"********");
  70. }
  71. /**
  72. * 测试分页
  73. * @throws Throwable
  74. */
  75. public void testScroll() throws Throwable
  76. {
  77. PersonService personService=new PersonService(this.getContext());
  78. List<Person> persons=personService.getScrollData(3, 3);
  79. for(Person person:persons)
  80. {
  81. Log.i(TAG, person.toString());
  82. }
  83. }
  84. /**
  85. * 测试删除一条记录
  86. * @throws Throwable
  87. */
  88. public void testDelete() throws Throwable
  89. {
  90. PersonService personService=new PersonService(this.getContext());
  91. personService.delete(5);
  92. }
  93. }

[java] view
plain
copy

  1. package com.zyq.service;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. public class DBOpenHelper extends SQLiteOpenHelper
  6. {
  7. /**
  8. * 如果想额外的增加一个字段(需求)
  9. * 可以把版本号更改掉 但必须 >=1
  10. * 更改版本号之后 会根据版本号判断是不是上次创建的时候 (目前的版本号和传入的版本号是否一致 )
  11. * 如果不是会执行 onUpgrade() 方法
  12. * @param context
  13. */
  14. public DBOpenHelper(Context context)
  15. {
  16. super(context, "zyq.db", null, 2);
  17. }
  18. /**
  19. * 在数据库创建的时候第一个调用的方法
  20. * 适合创建表结构
  21. */
  22. @Override
  23. public void onCreate(SQLiteDatabase db)
  24. {
  25. db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");//创建表
  26. }
  27. /**
  28. * 更新表结构 在数据库版本号发生改变的时候调用
  29. * 应用升级
  30. */
  31. @Override
  32. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  33. {
  34. db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
  35. }
  36. }

[java] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.zyq.db"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <uses-library android:name="android.test.runner" />
  8. <activity android:name=".MainActivity"
  9. android:label="@string/app_name">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. </application>
  16. <uses-sdk android:minSdkVersion="8" />
  17. <instrumentation android:name="android.test.InstrumentationTestRunner"
  18. android:targetPackage="com.zyq.db" android:label="Tests for My App" />
  19. </manifest>

[java] view
plain
copy

  1. package com.zyq.service;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import com.zyq.voo.Person;
  8. public class PersonService
  9. {
  10. private DBOpenHelper helper;
  11. public PersonService(Context context)
  12. {
  13. helper=new DBOpenHelper(context);
  14. }
  15. /**
  16. * 新增一条记录
  17. * @param person
  18. */
  19. public void save(Person person)
  20. {
  21. SQLiteDatabase db=helper.getWritableDatabase();//Create and/or open a database that will be used for reading and writing
  22. db.execSQL("INSERT INTO person(name,phone) values(?,?)",new Object[]{person.getName().trim(),person.getPhone().trim()});//使用占位符进行转译
  23. //      db.close();  不关数据库连接 。可以提高性能 因为创建数据库的时候的操作模式是私有的。
  24. //                                        代表此数据库,只能被本应用所访问 单用户的,可以维持长久的链接
  25. }
  26. /**
  27. * 更新某一条记录
  28. * @param person
  29. */
  30. public void update(Person person)
  31. {
  32. SQLiteDatabase db=helper.getWritableDatabase();
  33. db.execSQL("update person set phone=?,name=? where personid=?",
  34. new Object[]{person.getPhone().trim(),person.getName().trim(),person.getId()});
  35. }
  36. /**
  37. * 根据ID查询某条记录
  38. * @param id
  39. * @return
  40. */
  41. public Person find(Integer id)
  42. {
  43. SQLiteDatabase db=helper.getReadableDatabase();
  44. Cursor cursor=db.rawQuery("select * from person where personid=?", new String[]{id.toString()});//Cursor 游标和 ResultSet 很像
  45. if(cursor.moveToFirst())//Move the cursor to the first row. This method will return false if the cursor is empty.
  46. {
  47. int personid=cursor.getInt(cursor.getColumnIndex("personid"));
  48. String name=cursor.getString(cursor.getColumnIndex("name"));
  49. String phone=cursor.getString(cursor.getColumnIndex("phone"));
  50. return new Person(personid,name,phone);
  51. }
  52. return null;
  53. }
  54. /**
  55. * 删除某一条记录
  56. * @param id
  57. */
  58. public void delete(Integer id)
  59. {
  60. SQLiteDatabase db=helper.getWritableDatabase();
  61. db.execSQL("delete from person where personid=?",
  62. new Object[]{id});
  63. }
  64. /**
  65. * 得到记录数
  66. * @return
  67. */
  68. public long getCount()
  69. {
  70. SQLiteDatabase db=helper.getReadableDatabase();
  71. Cursor cursor=db.rawQuery("select count(*) from person", null);
  72. cursor.moveToFirst();
  73. return cursor.getLong(0);
  74. }
  75. /**
  76. * 分页查询方法 SQL语句跟MySQL的语法一样
  77. * @return
  78. */
  79. public List<Person> getScrollData(int offset,int maxResult)
  80. {
  81. List<Person> persons=new ArrayList<Person>();
  82. SQLiteDatabase db=helper.getReadableDatabase();
  83. Cursor cursor=db.rawQuery("select * from person limit ?,?",
  84. new String[]{String.valueOf(offset),String.valueOf(maxResult)});
  85. while (cursor.moveToNext())
  86. {
  87. int personid=cursor.getInt(cursor.getColumnIndex("personid"));
  88. String name=cursor.getString(cursor.getColumnIndex("name"));
  89. String phone=cursor.getString(cursor.getColumnIndex("phone"));
  90. persons.add(new Person(personid,name,phone));
  91. }
  92. return persons;
  93. }
  94. }

[c-sharp] view
plain
copy

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

Android 之采用execSQL和rawQuery方法完成数据的添删改查操作的更多相关文章

  1. CakePHP采用model的save方法更新数据所需查询

    采用model的save方法更新数据所需查询 1. 验证时候要确认是update 或者 create,以便使用对应规则 public $validate = array( 'field_name' = ...

  2. Android SQLite数据库增删改查操作

    一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL.INTEGER.REAL(浮点数字). TEXT(字符 ...

  3. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  4. (转)Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

    原文:http://blog.csdn.net/lidew521/article/details/8655229 1.SQLite介绍:最大特点是,无数据类型;除了可以使用文件或SharedPrefe ...

  5. dbutils中实现数据的增删改查的方法,反射常用的方法,绝对路径的写法(杂记)

    jsp的三个指令为:page,include,taglib... 建立一个jsp文件,建立起绝对路径,使用时,其他jsp文件导入即可 导入方法:<%@ include file="/c ...

  6. 黎活明8天快速掌握android视频教程--17_创建数据库与完成数据添删改查

    1.我们首先来看下整个项目 项目也是采用mvc的框架 package dB; import android.content.Context; import android.database.sqlit ...

  7. Android使用内容提供者实现增删改查操作

    Android使用内容提供者实现增删改查操作 这里需要建立两个项目:SiYouShuJuKu(使用内容提供者暴露相关的操作),DQDYGApplication(使用内容解析者对第一个应用进行相关的解析 ...

  8. Android开发 ---ORMLite实现数据的增删改查,单例模式,Dao栈

    效果图: 项目目录截图: 1.activity_main.xml 描述: 两行显示8个按钮 <?xml version="1.0" encoding="utf-8& ...

  9. asp.net操作GridView添删改查的两种方法 及 光棒效果

    这部份小内容很想写下来了,因为是基础中的基础,但是近来用的比较少,又温习了一篇,发现有点陌生了,所以,还是写一下吧. 方法一:使用Gridview本身自带的事件处理,代码如下(注意:每次操作完都得重新 ...

随机推荐

  1. $SP15637\ GNYR04H\ -\ Mr\ Youngs\ Picture\ Permutations$

    传送门 Description 杨先生希望为他的班级拍照.学生将排成一行,每行不超过后面的行,并且行的左端对齐.例如,可以安排12名学生排列(从后到前)5,3,3和1名学生. X X X X X X ...

  2. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  3. Django进阶一

    目录 表关系创建 django请求生命周期流程 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 虚拟环境 django版本区别 伪静态 视图层 三板斧 JsonResponse前后端交互数据 ...

  4. git简单使用指南

    git - 简易指南 这是一篇最适合初学者的教程,这里面没有高深的内容.学习git它可以帮助你管项目代码,提高团队开发效率.我使用的是win10系统,这里我会用它来给大家讲解. git - 安装 安装 ...

  5. Cesium本地影像与地形服务发布

    目录 1 数据切片 1.1 影像处理 1.2 地形处理 2 Web应用服务器安装与配置 2.1 Tomcat安装及配置 2.2 IIS安装及配置 3 本地影像与地形服务发布 4 参考资料 @(目录) ...

  6. 【转】HTML5+WebGL:构建 3D 网页新世界

    今年下半年, HTML5 和 WebGL 变成极热门词语,3D 网页来势汹汹.主流的浏览器 Google Chrome 以及 Mozilla Firefox 均致力于 HTML5+WebGL 的 3D ...

  7. 基于Saltstack、Artifactory打造传统模式下持续部署平台

    一.持续部署 1. 现状 由于没有建立标准的持续部署流程,导致了版本管理混乱,制品管理混乱,上线持续时间长,上线测试覆盖不全面,业务流量上升后故障较多,排查复杂.运维.测试.开发人员每次版本迭代的时候 ...

  8. 使用C#交互快速生成代码!

    #r "System.Reflection" #r "D:\xk.erp\OP.Model\bin\Debug\OP.Model.dll" using Syst ...

  9. 【PCIE-3】---PCIE设备的枚举扫描(经典好文)

    前面两个小节大致总结了下PCIE的基本知识,算是扫盲篇吧.本文主要总结PCIE设备的枚举扫描过程,此部分才是PCIE模块的重点,无论是在BIOS下还是系统驱动下都会用到. 按照国际惯例,先列问题: 1 ...

  10. 转:详解G1垃圾收集器

    G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the dif ...