Data storage and interface display based on Android Application Development (3): android Application Development
Generate XML file backup text message
- Create several virtual text message objects that exist in the list
- Backup Data is usually backed up to the SD card
Concatenate strings using StringBuffer
Append all nodes of the xml file to the sb object
Sb. append ("<? Xml version = '1. 0' encoding = 'utf-8' standalone = 'Yes'?> "); // Add the Start Node sb. append (" <smss> ") of smss ");.......
Write sb to the output stream
fos.write(sb.toString().getBytes());
Use the XMl serializer to generate an xml file
Get the xml serializer object
XmlSerializer xs = Xml.newSerializer();
Set the output stream for the serializer
File file = new File (Environment. getExternalStorageDirectory (), "backupsms. xml "); FileOutputStream fos = new FileOutputStream (file); // specify the output stream xs for the serializer. setOutput (fos, "UTF-8 ");
Start generating xml file
xs.startDocument("utf-8", true);xs.startTag(null, "smss");......
Pull parses xml files
- First, write an xml file to save some weather information.
Get xml file
InputStream is = getClassLoader().getResourceAsStream("weather.xml");
Get pull parser
XmlPullParser xp = Xml.newPullParser();
Start Parsing
Obtains the event type of the current node where the pointer is located.
int type = xp.getEventType();
There are five main types of events
- START_DOCUMENT: Event Type of the xml Header
- END_DOCUMENT: event type at the end of xml
- START_TAG: The Event Type of the Start Node.
- END_TAG: Event Type of the End Node
- TEXT: Event Type of the TEXT node
If the retrieved event type is not END_DOCUMENT, the parsing is not complete. If yes, the parsing is complete and the while loop ends.
while(type != XmlPullParser.END_DOCUMENT)
When parsing to different nodes, we need to perform different operations, so we can determine the name of the current node.
- When it is parsed to the Start Node of weather, a new list is generated.
- When it is parsed to the Start Node of the city, the city object is created to save the text to be parsed more conveniently.
When the node starts to be parsed to name, get the text content of the next node. The same is true for temp and pm.
Case XmlPullParser. START_TAG: // get the name of the current node if ("weather ". equals (xp. getName () {citys = new ArrayList <City> ();} else if ("city ". equals (xp. getName () {city = new City ();} else if ("name ". equals (xp. getName () {// obtain the text String name = xp for the next node of the current node. nextText (); city. setName (name);} else if ("temp ". equals (xp. getName () {String temp = xp. nextText (); city. setTemp (temp);} else if ("pm ". equals (xp. getName () {String pm = xp. nextText (); city. setPm (pm);} break;
When it is resolved to the End Node of the city, it means that all the three subnodes of the city have been parsed, and the city object is added to the list
case XmlPullParser.END_TAG: if("city".equals(xp.getName())){ citys.add(city); }
Test
Unit Test junit
Define a class that inherits AndroidTestCase. Define a method in the class to test this method.
When specifying the command set, targetPackage specifies the package name of the application you want to test.
<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.ibky.junit"></instrumentation>
Define the class library used
<uses-library android:name="android.test.runner"></uses-library>
The role of assertion to check whether the running result is consistent with the expectation
- If an application exception occurs, it is thrown to the test framework.
SQLite Database
Create a database
// Create the OpenHelper object MyOpenHelper oh = new MyOpenHelper (getContext (), "person. db ", null, 1); // obtain the database object. If the database does not exist, create and obtain the database first. If yes, obtain SQLiteDatabase db = oh. getWritableDatabase ();
- GetWritableDatabase (): Open a database that can be read or written.
- GetReadableDatabase (): Open the read-only database when the disk space is insufficient. Otherwise, the read/write database can be opened.
Create a table when creating a database
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table person (_id integer primary key autoincrement, name char(10), phone char(20), money integer(20))");}
SQL statements for adding, deleting, modifying, and querying databases
- Insert into person (name, phone, money) values ('zhang san', '123', 159874611 );
- Delete from person where name = 'Li si' and _ id = 4;
- Update person set money = 6000 where name = 'Li si ';
- Select name, phone from person where name = 'zhang san ';
Execute SQL statements to add, delete, modify, and query
// Insert db.exe cSQL ("insert into person (name, phone, money) values (?, ?, ?); ", New Object [] {" zhangsan ", 15987461,750 00}); // query Cursor cs = db. rawQuery ("select _ id, name, money from person where name = ?; ", New String [] {" James "});
This method is called before the test method is executed.
Protected void setUp () throws Exception {super. setUp (); // obtain the virtual context object oh = new MyOpenHelper (getContext (), "people. db ", null, 1 );}
Use APIs for addition, deletion, modification, and query
Insert
// Save the data to be stored in the database in the form of key-value pairs ContentValues cv = new ContentValues (); cv. put ("name", "Liu Neng"); cv. put ("phone", 1651646); cv. put ("money", 3500); // The returned value is the primary key of the modified row. If an error occurs,-1 long I = db is returned. insert ("person", null, cv );
Delete
// The returned value is the number of deleted rows int I = db. delete ("person", "_ id =? And name =? ", New String [] {" 1 "," James "});
Modify
ContentValues cv = new ContentValues (); cv. put ("money", 25000); int I = db. update ("person", cv, "name =? ", New String [] {" Zhao Si "});
Query
// Arg1: The field to be queried // arg2: Query condition // arg3: The placeholder for filling the query condition Cursor cs = db. query ("person", new String [] {"name", "money"}, "name =? ", New String [] {" zhangsan "}, null); while (cs. moveToNext () {// obtain the index value of the specified column String name = cs. getString (cs. getColumnIndex ("name"); String money = cs. getString (cs. getColumnIndex ("money"); System. out. println (name + ";" + money );}
Transactions
- Ensure that multiple SQL statements either succeed or fail at the same time
- The most common case: bank transfers
Transaction api
Try {// enable transaction db. beginTransaction ();........... // set the db for successful transaction execution. setTransactionSuccessful ();} finally {// close the transaction // if the transaction has been set to run successfully, the SQL statement takes effect; otherwise, the db does not take effect. endTransaction ();}
Display database data to the screen ListView
- Is used to display the entries of a row
- MVC Structure
- M: model layer, data to be displayed ---- people set
- V: view layer. The user-viewed interface is ListView.
- C: control layer, how to display operation data ---- adapter object
- Each entry is a View object.
BaseAdapter
Entry Cache
- When an entry is displayed on the screen, the system caches the entry to the memory. When the entry enters the screen again, the system uses the cached entry as the convertView parameter when calling getView again, however, the input entry is not necessarily the previously cached entry. That is, when the system calls the getView method to obtain the first entry, it is possible to pass in the cache of any entry.