Desarrollo de Aplicaciones M�viles ANDROID 00000101-00010010 - PowerPoint by IM5lOy

VIEWS: 0 PAGES: 26

									@+id/Data Storage
     Android


     PUJ - MIT
    LOGyCA-CLI
                     Agenda
• Data Storage
  •   Shared Preferences
  •   Internal Storage
  •   SQLite
  •   Content Providers
                   Data Storage
• Opciones:
  – Shared Preferences
     • Almacenamiento de datos privados en parejas key-value.
  – Internal Storage
     • Almacena datos privados en la memoria del dispositivo.
  – External Storage
     • Almacena datos públicos en almacenamiento externo
       compartido.
  – SQLite Databases
     • Estructura de almacenamiento de datos en una DB
       privada.
              Data Storage
           Shared Preferences
• Escribir valores
  – 1. Método edit() para tener un
    SharedPreferences.Editor
  – 2. Método putBoolean() y putString().
  – 3. Confirmar nuevos valores con el método
    commit().
• Leer valores
  – 1. Obtener la instancia de SharedPreferences.
  – 2. Usar los métodos getBoolean y getString.
                                      Data Storage
                                   Shared Preferences
•   public class Calc extends Activity {
      public static final String PREFS_NAME = "MyPrefsFile";

        @Override
        protected void onCreate(Bundle state){
         super.onCreate(state);
         ...

            // Restore preferences
            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            boolean silent = settings.getBoolean("silentMode", false);
            setSilent(silent);
        }

        @Override
        protected void onStop(){
         super.onStop();

            // We need an Editor object to make preference changes.
            // All objects are from android.context.Context
            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            SharedPreferences.Editor editor = settings.edit();
            editor.putBoolean("silentMode", mSilentMode);

            // Commit the edits!
            editor.commit();
        }
    }
                Data Storage
              Internal Storage
• Para crear y escribir en un archivo privado en
  almacenamiento interno:
  – 1.Invocar openFileOutput().
  – 2. write()
  – 3. Cerrar el flujo close()
• Para leer
  – 1. Invocar openFileInput().
  – 2. read()
  – 3. Cerra el flujo close()
                          Data Storage
                        Internal Storage
• Para adicionar datos.
   fos = openFileOutput("datos", Context.MODE_APPEND);
   String men = "hello world!";
   fos.write(men.getBytes());
   fos.close();


• Para leer datos.
  fis = openFileInput("datos");
  byte[] reader = new byte[fis.available()];
  while(fis.read(reader) != -1){}
  ((TextView)findViewById(R.id.TextView03)).setText(":"+ new String(reader));
  fis.close();
                Data Storage
                   SQLite
• Características
  – Open Source
  – Son BD privadas de la aplicación.
  – Para escribir y leer se puede utilizar,
    getWritableDatabase() y getReadableDatabase(),
    respectivamente.
  – Se puede tambien utilizar Cursor que provee
    métodos para manipular la base de datos.
                             Data Storage
                                SQLite
•   public class DictionaryOpenHelper extends SQLiteOpenHelper {

        private static final int DATABASE_VERSION = 2;
        private static final String DICTIONARY_TABLE_NAME = "dictionary";
        private static final String DICTIONARY_TABLE_CREATE =
               "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
               KEY_WORD + " TEXT, " +
               KEY_DEFINITION + " TEXT);";

        DictionaryOpenHelper(Context context) {
          super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
          db.execSQL(DICTIONARY_TABLE_CREATE);
        }
    }
                     Data Storage
                    SQLite / Cursor
• Cunsulta.
  String[] resultColumns = new String[] {
        KEY_ID,
        NAME,
        DESCRIPTION };
  Cursor cursor = db.query(true, DATABASE_TABLE, resultColumns, null,
  null, null, null);

• Adicionar.
  ContentValues newValues = new ContentValues();
  newValues.put(NAME,"android");
  newValues.put(DESCRIPTION, “...”);
  db.insert(DATABASE_TABLE, null,newValues);
                     Data Storage
                    SQLite / Cursor
• Actualizar.
  ContentValues updatedValues = new ContentValues();
  updatedValues.put(NAME, "peter");
  String where = KEY_ID + "=" + 1;
  db.update(DATABASE_TABLE, updatedValues, where, null);


• Borrar.
  db.delete(DATABASE_TABLE, KEY_ID + "=" + rowId, null);
                              Data Storage
                             SQLite / Cursor
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
 xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">
 <LinearLayout xmlns:android=
  "http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">
  <TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />
  <TextView android:id="@+id/out_text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="" />
 </LinearLayout>
</ScrollView>
                                                                 Data Storage
                                                                SQLite / Cursor
package ejemplos.persistencia;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class principal extends Activity {
 private TextView output;

    private DataHelper dh;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.mainp);

         this.output = (TextView) this.findViewById(R.id.out_text);

         this.dh = new DataHelper(this);
         this.dh.deleteAll();
         this.dh.insert("n1 a1");    this.dh.insert("n2 a2");   this.dh.insert("n3 a3");
         List<String> names = this.dh.selectAll();
         StringBuilder sb = new StringBuilder();
         sb.append("Names in database:\n");
         for (String name : names) {
           sb.append(name + "\n");
         }

         Log.d("EXAMPLE", "names size - " + names.size());
         this.output.setText(sb.toString());
     }
}
                                                        Data Storage
                                                       SQLite / Cursor
package ejemplos.persistencia;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class DataHelper {

 private static final String DATABASE_NAME = "example.db";
 private static final int DATABASE_VERSION = 1;
 private static final String TABLE_NAME = "table1";

 private Context context;
 private SQLiteDatabase db;

 private SQLiteStatement insertStmt;
 private static final String INSERT = "insert into "
  + TABLE_NAME + "(name) values (?)";

 public DataHelper(Context context) {
   this.context = context;
   OpenHelper openHelper = new OpenHelper(this.context);
   this.db = openHelper.getWritableDatabase();
   this.insertStmt = this.db.compileStatement(INSERT);
 }
                                                    Data Storage
 public long insert(String name) {
                                                   SQLite / Cursor
    this.insertStmt.bindString(1, name);
    return this.insertStmt.executeInsert();
  }
  public void deleteAll() {
    this.db.delete(TABLE_NAME, null, null);
  }
  public List<String> selectAll() {
    List<String> list = new ArrayList<String>();
    Cursor cursor = this.db.query(TABLE_NAME, new String[] { "name" },
      null, null, null, null, "name desc");
    if (cursor.moveToFirst()) {
      do {
         list.add(cursor.getString(0));
      } while (cursor.moveToNext());
    }
    if (cursor != null && !cursor.isClosed()) {
      cursor.close();
    }
    return list;
  }
  private static class OpenHelper extends SQLiteOpenHelper {
    OpenHelper(Context context) {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
      db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      Log.w("Example", "Upgrading database, this will drop tables and recreate.");
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
      onCreate(db);
    }
  }
}
               Data Storage
             Content Provider
• Leer y escribir datos que pueden ser
  accesibles desde cualquier aplicación.
• Maneja un número de content providers para
  los tipos de datos más comunes (audio, video,
  información personal de contactos, etc.)
• Se pueden tener propios datos públicos
  – Crear un propio content provider
  – Adicionar datos a un content provider existente.
            Data Storage
       Content Provider / Bases
• Cada content provider almacena los datos
  dependiendo del tipo.
• Todos implementan una interfaz común para
  consultar el provider y retornar los resultados.
  – Adicionar
  – Modificar
  – Borrar
• ContentResolver cr = getContentResolver()
               Data Storage
       Content Provider / Modelo de
                  datos
• Se organizan los datos en una simple tabla de
  un modelo de base de datos.
• Cada fila es un registro y cada columna es tipo
  particular de datos.
ID NUMBER           NUMBER_KEY     LABEL             NAME            TYPE
13 (425) 555 6677   425 555 6677   Kirkland office   Bully Pulpit   TYPE_WORK


• Una consulta retorna una instancia de Cursor
    – Se puede mover de registro a registro, y de columna
      en columna.
               Data Storage
           Content Provider / URI
• Cada CP expone un URI público que identifica
  únicamente el conjunto de datos.
• Se controlan las múltiples tablas publicando URI
  separados.
• Todos los URI para providers empieza con: content://
• Al definir un CP propio se define la constante
  CONTENT_URI, ejemplo para el URI de una tabla de
  personas:
   – android.provider.Contacts.Phones.CONTENT_URI
• Cada ContentResolver toma el URI como primer
  argumento.
                   Data Storage
                   Querying a CP
• Se necesitan 3 piezas de información para consultar un
  CP
   – El URI que identifica el provider
   – Los nombres de los campos de datos que pueden recibir.
   – Los tipos de datos de estos campos.
• Haciendo un query
   – Usar ContentResolver.query() ó
     Activity.managedQuery(): El último causa que la
     actividad maneje el ciclo de vida del Cursor.
                        Data Storage
                        Querying a CP
• import android.provider.Contacts.People;
  import android.content.ContentUris;
  import android.net.Uri;
  import android.database.Cursor;

   // Use the Content Uris method to produce the base URI for the contact with
   //_ID == 23.
   Uri myPerson = ContentUris.withAppendedId(People.CONTENT_URI, 23);

   // Alternatively, use the Uri method to produce the base URI.
   // It takes a string rather than an integer.
   Uri myPerson = Uri.withAppendedPath(People.CONTENT_URI, "23");

   // Then query for this specific record:
   Cursor cur = managedQuery(myPerson, null, null, null, null)
                               Data Storage
                               Querying a CP
•   import android.provider.Contacts.People;
    import android.database.Cursor;

    // Form an array specifying which columns to return.
    String[] projection = new String[] {
                      People._ID,
                      People._COUNT,
                      People.NAME,
                      People.NUMBER
                   };

    // Get the base URI for the People table in the Contacts content provider.
    Uri contacts = People.CONTENT_URI;

    // Make the query.
    Cursor managedCursor = managedQuery(contacts,
                 projection, // Which columns to return
                 null,    // Which rows to return (all rows)
                 null,    // Selection arguments (none)
                 // Put the results in ascending order by name
                 People.NAME + " ASC");
                            Data Storage
                        Reading retrieved data
import android.provider.Contacts.People;

    private void getColumnData(Cursor cur){
      if (cur.moveToFirst()) {

            String name;
            String phoneNumber;
            int nameColumn = cur.getColumnIndex(People.NAME);
            int phoneColumn = cur.getColumnIndex(People.NUMBER);
            String imagePath;

            do {
              // Get the field values
              name = cur.getString(nameColumn);
              phoneNumber = cur.getString(phoneColumn);

              // Do something with the values.
              ...

            } while (cur.moveToNext());

        }
    }
                          Data Storage
                         Adding records
import android.provider.Contacts.People;
   import android.content.ContentResolver;
   import android.content.ContentValues;

   ContentValues values = new ContentValues();

   // Add Abraham Lincoln to contacts and make him a favorite.
   values.put(People.NAME, "Abraham Lincoln");
   // 1 = the new contact is added to favorites
   // 0 = the new contact is not added to favorites
   values.put(People.STARRED, 1);

   Uri uri = getContentResolver().insert(People.CONTENT_URI, values)
                            Data Storage
                            Creating a CP
•   Definiendo el URI
    public static final Uri CONTENT_URI =
             Uri.parse("content://com.example.codelab.transportationprovider“)
•   Definiendo las columna
•   Declarar el CP

•   <provider android:name="com.example.autos.AutoInfoProvider"
         android:authorities="com.example.autos.autoinfoprovider"
         . . . />
    </provider>
               Referencias
• [1] Plataforma android, página consultada el
  31/01/2011
http://developer.android.com/guide/basics/wha
  t-is-android.html
• [2] Plataforma Android, página consultada el
  31/01/2011
http://developer.android.com/sdk/index.html

								
To top