1. 1.listview入门,自定义的数据适配器
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context=".ListViewActivity" >
  7.  
  8. <ListView
  9. android:id="@+id/lv"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent" >
  12. </ListView>
  13. </RelativeLayout>
  14.  
  15. public class ListViewActivity extends Activity {
  16.  
  17. private ListView lv;
  18. public String tag = "ListViewActivity";
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_list_view);
  24. lv = (ListView) findViewById(R.id.lv);
  25. lv.setAdapter(new MyAdapter());
  26. }
  27.  
  28. /**
  29. * 自定义的数据适配器
  30. *
  31. * @author Administrator
  32. *
  33. */
  34. private class MyAdapter extends BaseAdapter {
  35.  
  36. /**
  37. * 控制listview里面有多个条目.
  38. */
  39. @Override
  40. public int getCount() {
  41. return 15;
  42. }
  43.  
  44. /**
  45. * 返回每个位置对应的view对象
  46. */
  47. @Override
  48. public View getView(int position, View convertView, ViewGroup parent) {
  49. // 这个方法被调用了多少次?
  50. Log.i(tag, "POSITION:" + position);
  51. TextView tv = new TextView(ListViewActivity.this);
  52. tv.setTextSize(30);
  53. tv.setTextColor(Color.RED);
  54. tv.setText("我是第" + position + "个条目");
  55. return tv;
  56. }
  57.  
  58. @Override
  59. public Object getItem(int position) {
  60. return null;
  61. }
  62.  
  63. @Override
  64. public long getItemId(int position) {
  65. return 0;
  66. }
  67.  
  68. }
  69.  
  70. }
  71.  
  72. 2.采用layoutInflater打气筒创建一个view对象
  73. 在上面的基础上添加list_item.xml
  74. <?xml version="1.0" encoding="utf-8"?>
  75. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  76. android:layout_width="match_parent"
  77. android:layout_height="wrap_content"
  78. android:orientation="vertical" >
  79.  
  80. <TextView
  81. android:id="@+id/tv_name"
  82. android:layout_width="match_parent"
  83. android:layout_height="wrap_content"
  84. android:textColor="#000000" />
  85.  
  86. <TextView
  87. android:id="@+id/tv_number"
  88. android:layout_width="match_parent"
  89. android:layout_height="wrap_content" />
  90.  
  91. </LinearLayout>
  92.  
  93. /**
  94. * 返回每个位置对应的view对象
  95. */
  96. @Override
  97. public View getView(int position, View convertView, ViewGroup parent) {
  98. // 这个方法被调用了多少次?
  99. Log.i(tag, "POSITION:" + position);
  100. View view = View.inflate(getApplicationContext(),
  101. R.layout.list_item, null);
  102. TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
  103. TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
  104. tv_name.setText("name:"+position);
  105. tv_number.setText(position+"");
  106. return view;
  107. }
  108.  
  109. .常用数据适配器ArrayAdapter
  110. protected void onCreate(Bundle savedInstanceState) {
  111. super.onCreate(savedInstanceState);
  112. setContentView(R.layout.activity_list_view);
  113. lv = (ListView) findViewById(R.id.lv);
  114. lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
  115. R.id.tv_name, new String[] { "aaaa", "bbbb", "cccc", "ddddd" }));
  116. }
  117.  
  118. .常用数据适配器SimpleAdapter
  119. protected void onCreate(Bundle savedInstanceState) {
  120. super.onCreate(savedInstanceState);
  121. setContentView(R.layout.activity_list_view);
  122. lv = (ListView) findViewById(R.id.lv);
  123.  
  124. List<Map<String, String>> data = new ArrayList<Map<String, String>>();
  125.  
  126. Map<String, String> item1 = new HashMap<String, String>();
  127. item1.put("name", "zhangsna");
  128. item1.put("number", "124245");
  129.  
  130. Map<String, String> item2 = new HashMap<String, String>();
  131. item2.put("name", "lisi");
  132. item2.put("number", "4545");
  133.  
  134. data.add(item1);
  135. data.add(item2);
  136.  
  137. lv.setAdapter(new SimpleAdapter(this, data, R.layout.list_item,
  138. new String[] { "name", "number" }, new int[] { R.id.tv_name,
  139. R.id.tv_number }));
  140.  
  141. }
  142.  
  143. .使用ContentProvider(内容提供者)共享数据
  144. ContentProvider android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。
  145. 如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一
  146. 使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
  147. 定义一个类继承ContentProvider
  148. package com.itheima.contentprovider;
  149.  
  150. import android.content.ContentProvider;
  151. import android.content.ContentUris;
  152. import android.content.ContentValues;
  153. import android.content.UriMatcher;
  154. import android.database.Cursor;
  155. import android.database.sqlite.SQLiteDatabase;
  156. import android.net.Uri;
  157.  
  158. import com.example.demo1.db.PersonSQLiteOpenHelper;
  159.  
  160. public class PersonProvider extends ContentProvider {
  161.  
  162. // 定义一个uri匹配器,用于匹配uri,如果匹配不成功返回-1
  163. private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
  164. private static final int INSERT = 1;
  165. private static final int DELETE = 2;
  166. private static final int UPDATE = 3;
  167. private static final int QUERY = 4;
  168. private static final int QUERYONE = 5;
  169. private static final Uri URI = Uri.parse("content://person.db");
  170.  
  171. private PersonSQLiteOpenHelper helper;
  172.  
  173. static {
  174. // 添加一组匹配规则
  175. // authority: the authority to match
  176. // path: the path to match. * may be used as a wild card for any text,
  177. // and # may be used as a wild card for numbers.
  178. // code: the code that is returned when a URI is matched against the
  179. // given components. Must be positive.
  180. matcher.addURI("com.itheima.contentprovider.personprovider", "insert",
  181. INSERT);
  182. matcher.addURI("com.itheima.contentprovider.personprovider", "delete",
  183. DELETE);
  184. matcher.addURI("com.itheima.contentprovider.personprovider", "update",
  185. UPDATE);
  186. matcher.addURI("com.itheima.contentprovider.personprovider", "query",
  187. QUERY);
  188. matcher.addURI("com.itheima.contentprovider.personprovider", "query/#",
  189. QUERYONE);
  190. }
  191.  
  192. @Override
  193. public boolean onCreate() {
  194. this.helper = new PersonSQLiteOpenHelper(getContext());
  195. return false;
  196. }
  197.  
  198. @Override
  199. public Cursor query(Uri uri, String[] projection, String selection,
  200. String[] selectionArgs, String sortOrder) {
  201. if (matcher.match(uri) == QUERY) {
  202. SQLiteDatabase db = helper.getReadableDatabase();
  203. Cursor cursor = db.query("person", projection, selection,
  204. selectionArgs, null, null, sortOrder);
  205. // 注意这里的db和cursor不能关闭
  206. return cursor;
  207. } else if (matcher.match(uri) == QUERYONE) {
  208. SQLiteDatabase db = helper.getReadableDatabase();
  209. long id = ContentUris.parseId(uri);
  210. Cursor cursor = db.query("person", projection, "id=?",
  211. new String[] { id + "" }, null, null, sortOrder);
  212. // 注意这里的db和cursor不能关闭
  213. return cursor;
  214. } else {
  215. throw new IllegalArgumentException("非法uri");
  216. }
  217. }
  218.  
  219. @Override
  220. public int delete(Uri uri, String selection, String[] selectionArgs) {
  221. if (matcher.match(uri) == DELETE) {
  222. SQLiteDatabase db = helper.getWritableDatabase();
  223. // 注册内容观测者
  224. getContext().getContentResolver().notifyChange(URI, null);
  225. return db.delete("person", selection, selectionArgs);
  226. } else {
  227. throw new IllegalArgumentException("非法uri");
  228. }
  229. }
  230.  
  231. @Override
  232. public Uri insert(Uri uri, ContentValues values) {
  233. if (matcher.match(uri) == INSERT) {
  234. SQLiteDatabase db = helper.getWritableDatabase();
  235. long id = db.insert("person", null, values);
  236. getContext().getContentResolver().notifyChange(URI, null);
  237. // 返回指定的Uri路劲对象
  238. // content://cn.itcast.provider.custom.usersprovider/users/1
  239. return ContentUris.withAppendedId(uri, id);
  240.  
  241. } else {
  242. throw new IllegalArgumentException("非法uri");
  243. }
  244. }
  245.  
  246. @Override
  247. public int update(Uri uri, ContentValues values, String selection,
  248. String[] selectionArgs) {
  249. if (matcher.match(uri) == UPDATE) {
  250. SQLiteDatabase db = helper.getWritableDatabase();
  251. getContext().getContentResolver().notifyChange(URI, null);
  252. return db.update("person", values, selection, selectionArgs);
  253. } else {
  254. throw new IllegalArgumentException("非法uri");
  255. }
  256. }
  257.  
  258. /**
  259. * Implement this to handle requests for the MIME type of the data at the
  260. * given URI. The returned MIME type should start with
  261. * vnd.android.cursor.item for a single record, or vnd.android.cursor.dir/
  262. * for multiple items. This method can be called from multiple threads, as
  263. * described in Processes and Threads.
  264. */
  265. @Override
  266. public String getType(Uri uri) {
  267. if (matcher.match(uri) == QUERY) {
  268. return "vnd.android.cursor.dir/person";
  269. } else if (matcher.match(uri) == QUERYONE) {
  270. return "vnd.android.cursor.item/person";
  271. } else {
  272. return "";
  273. }
  274. }
  275.  
  276. }
  277.  
  278. 定义一个类继承SQLiteOpenHelper
  279. package com.example.demo1.db;
  280.  
  281. import android.content.Context;
  282. import android.database.sqlite.SQLiteDatabase;
  283. import android.database.sqlite.SQLiteOpenHelper;
  284.  
  285. public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
  286. private static final String DBFILENAME = "person.db";
  287. private static int db_version = 1;
  288.  
  289. public PersonSQLiteOpenHelper(Context context) {
  290. super(context, DBFILENAME, null, db_version);
  291. }
  292.  
  293. /**
  294. * 当数据库第一次创建时调用
  295. */
  296. @Override
  297. public void onCreate(SQLiteDatabase db) {
  298. String sql = "create table person(id integer primary key autoincrement,name varchar(20),number varchar(20))";
  299. db.execSQL(sql);
  300. }
  301.  
  302. /**
  303. * 当数据库的版本号发生增加的时候调用
  304. */
  305. @Override
  306. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  307. System.out.println("数据库更改!");
  308. String sql = "alter table person add account varchar(20)";
  309. db.execSQL(sql);
  310. }
  311.  
  312. }
  313.  
  314. 清单文件中注册内容提供者
  315. <provider android:name="com.itheima.contentprovider.PersonProvider"
  316. android:authorities="com.itheima.contentprovider.personprovider"
  317. ></provider>
  318.  
  319. 第三方软件
  320. public class MainActivity extends Activity {
  321.  
  322. @Override
  323. protected void onCreate(Bundle savedInstanceState) {
  324. super.onCreate(savedInstanceState);
  325. setContentView(R.layout.activity_main);
  326. }
  327.  
  328. public void getAll(View view) {
  329. ContentResolver resolver = this.getContentResolver();
  330. Uri uri = Uri
  331. .parse("content://com.itheima.contentprovider.personprovider/query");
  332. Cursor cursor = resolver.query(uri, null, null, null, null);
  333. StringBuffer sb = new StringBuffer();
  334. while (cursor.moveToNext()) {
  335. sb.append(cursor.getString(cursor.getColumnIndex("name")) + " -- "
  336. + cursor.getString(cursor.getColumnIndex("number")));
  337. sb.append("\n");
  338. }
  339. TextView tv_info = (TextView) this.findViewById(R.id.tv_info);
  340. tv_info.setText(sb.toString());
  341. cursor.close();
  342. }
  343.  
  344. public void getOne(View view) {
  345. ContentResolver resolver = this.getContentResolver();
  346. // Uri uri = Uri
  347. // .parse("content://com.itheima.contentprovider.personprovider/query");
  348. // Cursor cursor = resolver.query(uri, null, "id=?",new String[]{"1"} ,
  349. // null);
  350. Uri uri = Uri.parse("content://com.itheima.contentprovider.personprovider/query/1");
  351. Cursor cursor = resolver.query(uri, null, null, null, null);
  352. StringBuffer sb = new StringBuffer();
  353. if (cursor.moveToFirst()) {
  354. sb.append(cursor.getString(cursor.getColumnIndex("name")) + " -- "
  355. + cursor.getString(cursor.getColumnIndex("number")));
  356. sb.append("\n");
  357. }
  358. TextView tv_info = (TextView) this.findViewById(R.id.tv_info);
  359. tv_info.setText(sb.toString());
  360. cursor.close();
  361. }
  362.  
  363. public void insert(View view) {
  364. ContentResolver resolver = this.getContentResolver();
  365. Uri uri = Uri.parse("content://com.itheima.contentprovider.personprovider/insert");
  366. ContentValues values = new ContentValues();
  367. values.put("name", "reality");
  368. values.put("number", "567");
  369. Uri result = resolver.insert(uri, values);
  370. System.out.println("result = " + result);
  371. }
  372.  
  373. public void update(View view) {
  374. ContentResolver resolver = this.getContentResolver();
  375. Uri uri = Uri
  376. .parse("content://com.itheima.contentprovider.personprovider/update");
  377. ContentValues values = new ContentValues();
  378. values.put("name", "dog");
  379. values.put("number", "110");
  380. int result = resolver.update(uri, values, "id=?", new String[] { "1" });
  381. System.out.println("result = " + result);
  382. }
  383.  
  384. public void delete(View view) {
  385. ContentResolver resolver = this.getContentResolver();
  386. Uri uri = Uri
  387. .parse("content://com.itheima.contentprovider.personprovider/delete");
  388. int result = resolver.delete(uri, "id=?", new String[] { "3" });
  389. System.out.println("result = " + result);
  390. }
  391.  
  392. }
  393.  
  394. .短信的备份
  395. public class BackupsmsActivity extends Activity {
  396. /** Called when the activity is first created. */
  397. @Override
  398. public void onCreate(Bundle savedInstanceState) {
  399. super.onCreate(savedInstanceState);
  400. setContentView(R.layout.activity_backupsms);
  401. }
  402.  
  403. public void backupSMS(View view) {
  404. Uri uri = Uri.parse("content://sms");
  405. ContentResolver resolver = this.getContentResolver();
  406. Cursor cursor = resolver.query(uri, new String[] { "date", "body",
  407. "address", "type" }, null, null, null);
  408. ArrayList<SmsInfo> infos = new ArrayList<SmsInfo>();
  409. while (cursor.moveToNext()) {
  410. long date = cursor.getLong(0);
  411. String body = cursor.getString(1);
  412. String address = cursor.getString(2);
  413. int type = cursor.getInt(3);
  414. SmsInfo smsInfo = new SmsInfo(date, body, address, type);
  415. infos.add(smsInfo);
  416. }
  417. SmsUtil.save(this, infos);
  418. }
  419. }
  420.  
  421. public class SmsUtil {
  422. public static void save(Context context, ArrayList<SmsInfo> infos) {
  423. XmlSerializer xmlSerializer = Xml.newSerializer();
  424. File file = new File(Environment.getExternalStorageDirectory(),
  425. "sms_bak.xml");//mnt/sdcard/sms_bak.xml
  426. try {
  427. FileOutputStream fos = new FileOutputStream(file);
  428. xmlSerializer.setOutput(fos, "utf-8");
  429. xmlSerializer.startDocument("utf-8", true);
  430.  
  431. xmlSerializer.startTag(null, "smss");
  432.  
  433. for (SmsInfo info : infos) {
  434. xmlSerializer.startTag(null, "sms");
  435. xmlSerializer.attribute(null, "type", info.getType() + "");
  436.  
  437. xmlSerializer.startTag(null, "date");
  438. xmlSerializer.text(info.getDate() + "");
  439. xmlSerializer.endTag(null, "date");
  440.  
  441. xmlSerializer.startTag(null, "address");
  442. xmlSerializer.text(info.getAddress());
  443. xmlSerializer.endTag(null, "address");
  444.  
  445. xmlSerializer.startTag(null, "body");
  446. xmlSerializer.text(info.getBody());
  447. xmlSerializer.endTag(null, "body");
  448.  
  449. xmlSerializer.endTag(null, "sms");
  450. }
  451. xmlSerializer.endTag(null, "smss");
  452.  
  453. xmlSerializer.endDocument();
  454. fos.close();
  455. Toast.makeText(context, "保存成功", 0).show();
  456.  
  457. } catch (Exception e) {
  458. e.printStackTrace();
  459. Toast.makeText(context, "保存失败", 0).show();
  460. }
  461.  
  462. }
  463. }
  464.  
  465. public class SmsInfo {
  466. private int id;
  467. private long date;
  468. private String body;
  469. private String address;
  470. private int type;
  471.  
  472. public SmsInfo() {
  473. super();
  474. // TODO Auto-generated constructor stub
  475. }
  476.  
  477. public SmsInfo(int id, long date, String body, String address) {
  478. super();
  479. this.id = id;
  480. this.date = date;
  481. this.body = body;
  482. this.address = address;
  483. }
  484.  
  485. public SmsInfo(long date, String body, String address, int type) {
  486. super();
  487. this.date = date;
  488. this.body = body;
  489. this.address = address;
  490. this.type = type;
  491. }
  492.  
  493. public int getType() {
  494. return type;
  495. }
  496.  
  497. public void setType(int type) {
  498. this.type = type;
  499. }
  500.  
  501. public int getId() {
  502. return id;
  503. }
  504.  
  505. public void setId(int id) {
  506. this.id = id;
  507. }
  508.  
  509. public long getDate() {
  510. return date;
  511. }
  512.  
  513. public void setDate(long date) {
  514. this.date = date;
  515. }
  516.  
  517. public String getBody() {
  518. return body;
  519. }
  520.  
  521. public void setBody(String body) {
  522. this.body = body;
  523. }
  524.  
  525. public String getAddress() {
  526. return address;
  527. }
  528.  
  529. public void setAddress(String address) {
  530. this.address = address;
  531. }
  532.  
  533. }
  534.  
  535. .插入一条记录到系统短信应用
  536. public class InsertsmsActivity extends Activity {
  537. /** Called when the activity is first created. */
  538. @Override
  539. public void onCreate(Bundle savedInstanceState) {
  540. super.onCreate(savedInstanceState);
  541. setContentView(R.layout.activity_insertsms);
  542. new Thread() {
  543. public void run() {
  544. try {
  545. Thread.sleep(10000);
  546. Uri uri = Uri.parse("content://sms");
  547. ContentResolver resolver = getContentResolver();
  548. ContentValues values = new ContentValues();
  549. values.put("address", "10086");
  550. values.put("type", 1);
  551. values.put("date", System.currentTimeMillis());
  552. values.put("body", "您的余额还有100,000,000元!");
  553. resolver.insert(uri, values);
  554. } catch (InterruptedException e) {
  555. // TODO Auto-generated catch block
  556. e.printStackTrace();
  557. }
  558. }
  559.  
  560. }.start();
  561. }
  562. }
  563.  
  564. <uses-permission android:name="android.permission.READ_SMS" />
  565. <uses-permission android:name="android.permission.WRITE_SMS" />

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)的更多相关文章

  1. [android] 采用layoutInflater打气筒创建一个view对象

    上一节知道了ListView的工作原理,数据也展示出来了,但是TextView显示的非常难看,如果想美化一下,就先创建好一个布局出来,这个布局采用了两层LinearLayout嵌套,外层的水平方向,内 ...

  2. Android 采用Layout Inflater创建一个View对象

    接着上文<Android ListViewview入门>,本文使用android的Inflater来实现 在layouyt文件夹中新建一个list_item.xml的文件,添加如下代码: ...

  3. [android] 插入一条记录到系统短信应用里

    谷歌市场上有这些应用,模拟短信,原理就是把数据插入到短信应用的数据库里 获取ContentResolver对象,通过getContentResolver()方法 调用resolver对象的insert ...

  4. 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

    1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...

  5. AX 插入一条记录提示表记录已经存在,但是该记录实际上是不存在的。

    做测试的时候遇到一个情况"AX 插入一条记录提示表记录已经存在,但是该记录实际上是不存在的." 检查到该表(TABLE_ABC)所有的key都是AllowDuplicate的, 继 ...

  6. 一次插入多条记录 [mysql]

    调用多次INSERT语句不就可以插入多条记录了吗?但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析.优化等操作.幸好MySQL提供了另一种解决方案,就是使用一条I ...

  7. sql 中实现往表中插入一条记录并返回当前记录的ID

    写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...

  8. SQLServer 触发器 同时插入多条记录有关问题

    由于 SQL Server 的触发器, 没有 FOR EACH ROW (ORACL中有)的选项, 有时候不正确的使用 inserted 与deleted 可能会有点麻烦. 下面来一个简单的例子 -- ...

  9. ACCESS-delphi向中插入一条记录报错,但ACCESS不会

    问题:在DELPHI中向ACCESS中插入一条记录时,提示“插入错误”,但是取出SQL直接放在ACCESS中插入成功?答:原因是插入语句中的字段名是DELPHI的内部标示符.

随机推荐

  1. 如何将jsp页面的table报表转换到excel报表导出

    假设这就是你的jsp页面: 我们会添加一个“导出到excel”的超链接,它会把页面内容导出到excel文件中.那么这个页面会变成这个样子 在此,强调一下搜索时关键词的重要性,这样一下子可以定位到文章, ...

  2. 500 OOPS: vsftpd: both local and anonymous access

    配置ftp服务器,有如下报错 C:\netos74\bin>ftp 10.20.100.252Connected to 10.20.100.252.500 OOPS: vsftpd: both ...

  3. PYTHON 迭代器

    可以走直接作用于for循环的对象统称为可迭代对象使用:Iterable 使用isinstance()判断一个对象是否是Iterable对象: from collections import Itera ...

  4. #Deep Learning回顾#之基于深度学习的目标检测(阅读小结)

    原文链接:https://www.52ml.net/20287.html 这篇博文主要讲了深度学习在目标检测中的发展. 博文首先介绍了传统的目标检测算法过程: 传统的目标检测一般使用滑动窗口的框架,主 ...

  5. windows下C语言编程获取磁盘(分区)使用情况

    windows下编程获取磁盘(分区)使用情况 windows下编程获取磁盘(分区)使用情况 GetLogicalDriveStrings函数 使用示例 获取需要的缓冲区长度示例 获取所有驱动器号示例 ...

  6. 5-python学习——条件语句

    5-python学习——条件语句 5-python学习——条件语句 条件语句if else形式 if else条件语句说明 测试一下 编程语言一般都由这么几个部分组成 变量 条件分支语句 循环语句 函 ...

  7. [转]MySQL主从复制入门

    1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...

  8. 【MavenWeb】初探:创建一个Maven Web项目

    第一步:创建一个Simple的Maven项目 直接点下一步,把name上面的几个部分填写好,直接Finish即可. 就可以看到如下的结构: 注意点1:如果按照网上的其他一些做法来创建,你会发现少了sr ...

  9. 【Networkk】一篇文章完全搞清楚 scoket read/write 返回码、阻塞与非阻塞、异常处理 等让你头疼已久的问题

    浅谈TCP/IP网络编程中socket的行为   我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗 ...

  10. 《C++ Primer》 ---- 关于变量 与 基本类型

    类型是所有程序的基础;    C++ 定义了几种基本类型: 字符型(char 和 wchar_t),整型(short int long bool),浮点型(float doubel) 并且提供自定义数 ...