SlideShare une entreprise Scribd logo
1  sur  22
l

Persistence
l

l

l

Persistence

Three ways to store data
l Shared Preferences
l Files
l SQLite databases
Mechanism to store/access private data
l Content Providers
l

l

Shared Preferences

Three forms:
l

Share across all components in an application

l

getSharedPreferences(“SomeString”,Activity.MODE_PRIVATE);

l

Store only data needed by this Activity

l

l
l
l

getPreferences(Activity.MODE_PRIVATE);

Store only data needed by this Activity when Activity becomes
inactive (but not when finished)
Ex. Orientation change from portrait to landscape
use Bundle in onSaveInstanceState/onRestoreInstanceState/onCreate
l
l

Shared Preferences

Across all components
• public static final String CMPREFS = "CampusMapSharedPreferences";
•
•
•
•
•
•
•
•
•
•
•
•
•
•

private void savePreferences() {
SharedPreferences cmSharedPreferences =
getSharedPreferences(CMPREFS,Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = cmSharedPreferences.edit();
editor.putBoolean(VIRTUAL_MODE, inVirtualMode);
editor.putInt(MAP_INDEX, curMapIndex);
editor.commit();
}
private void restoreUIState() {
SharedPreferences cmSharedPreferences =
getSharedPreferences(CMPREFS,Activity.MODE_PRIVATE);
inVirtualMode = cmSharedPreferences.getBoolean(VIRTUAL_MODE, true);
curMapIndex = cmSharedPreferences.getInt(MAP_INDEX, 0);
}
l
l

Shared Preferences

Only for this Activity (each Activity has one)
•
•
•
•
•
•
•
•
•
•
•
•
•
•

private void savePreferences() {
SharedPreferences cmActivityPreferences =
getPreferences(Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = cmActivityPreferences.edit();
editor.putBoolean(VIRTUAL_MODE, inVirtualMode);
editor.putInt(MAP_INDEX, curMapIndex);
editor.commit();
}
private void restoreUIState() {
SharedPreferences cmActivityPreferences =
getPreferences(Activity.MODE_PRIVATE);
inVirtualMode = cmActivityPreferences.getBoolean(VIRTUAL_MODE, true);
curMapIndex = cmActivityPreferences.getInt(MAP_INDEX, 0);
}
l
l

Shared Preferences

Only for this Activity when inactive/active
l Note: onSaveInstanceState called when an Activity becomes
inactive, not when closed by finish() or user pressing back button

• public static final String TEXTVIEW_STATE_KEY = “TEXTVIEW_STATE_KEY";
•
•
•
•
•
•
•
•
•
•
•

private void onSaveInstanceState(Bundle outState) {
outState.putString(TEXTVIEW_STATE_KEY,
(TextView)findViewById(R.id.myTextView).getText().toString());
super.onSaveInstanceState(outState);
}
private void onRestoreInstanceState(Bundle inState) { //same for onCreate()
if(inState != null && inState.containsKey(TEXTVIEW_STATE_KEY)) {
(TextView)findViewById(R.id.myTextView).
setText(inState.getString(TEXTVIEW_STATE_KEY));
}
}
l
l
l

Files

Generally not recommended to use files
Store read-only static files in res/raw

• InputStream myFile =
getResources().openRawResource(R.raw.myfilename);
l
l
l

Files

Generally not recommended to use files
Store read-only static files in res/raw

• InputStream myFile =
getResources().openRawResource(R.raw.myfilename);
l
l
l

Files

Standard java.io is available
Can also use openFileOutput and openFileInput

• byte[] b = new String("Yo").getBytes();
• Also available:
• Context.MODE_PRIVATE
• try {
• Context.MODE_WORLD_READABLE
•
FileOutputStream fos =
•
openFileOutput("anotherExampleFile.txt",
•
Context.MODE_WORLD_WRITEABLE);
•
fos.write(b);
•
FileInputStream fis =
•
openFileInput("anotherExampleFile.txt");
•
fis.read(b);
• } catch (IOException e) {}
l

l

l
l

l

SQLite Databases

RDBMS provided through a library so it becomes part of
your app
Use the SQL you learned in database course
Use Db best practices
l Normalize data
l Encapsulate db info in helper or wrapper classes
Don’t store files (e.g. images or audio)
l Instead store the path string
l

Creating a Database

• SQLiteDatabase myDb =
•
openOrCreateDatabase("example.db",
•
Context.MODE_PRIVATE,
•
null); //optional CursorFactory
• myDb.execSQL("drop table if exists jokeTable");
• myDb.execSQL("create table jokeTable " +
•
" ( _id integer primary key autoincrement," +
•
"author text not null, joke text not null);");
l

l

l

•
•
•
•

Inserting Data

ContentValues are key/value pairs that are used when
inserting/updating databases
Each ContentValue object corresponds to one row in a table

ContentValues newValues = new ContentValues();
newValues.put("author", "David Janzen");
newValues.put("joke", "This is a joke");
myDb.insert("jokeTable",null,newValues);
l

Updating Data

• ContentValues updatedValues = new ContentValues();
• updatedValues.put("joke", "This is a better joke");
• myDb.update("jokeTable",
•
updatedValues,
•
"author='David Janzen'", //where clause
•
null);
//whereArgs
l

•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

Querying Data with query()

Cursor jokes = myDb.query("jokeTable",
null, //columns
null, //where clause
null, //args if ? in where clause
null, //groupBy
null, //having
null); //orderBy
if (jokes.moveToFirst()) {
do {
String author = jokes.getString(1);
String joke = jokes.getString(2);
((TextView)findViewById(R.id.hello)).setText(author +
": " + joke);
} while(jokes.moveToNext());
}
l

l
l
l
l
l
l
l

Other Cursor Functions

moveToPrevious
getCount
getColumnIndexOrThrow
getColumnName
getColumnNames
moveToPosition
getPosition
l

Deleting Data

• myDb.delete("jokeTable",
•
"author='David Janzen'",
•
null);
l

l

l
l

Content Providers

Apps can expose their data layer through a Content Provider,
identified by a URI
Some native apps provide Content Providers
Your apps can provide Content Providers
l
l

•
•
•
•
•
•
•
•
•
•
•
•

Content Resolver

Each application Context has a single ContentResolver that
can be used to access a Content Provider
• URI,colums,where,whereArgs,orderBy

Cursor allRows = getContentResolver().query(
People.CONTENT_URI, null, null, null, null);
startManagingCursor(allRows);
int nameIdx = allRows.getColumnIndexOrThrow(People.NAME);
int phoneIdx = allRows.getColumnIndexOrThrow(People.NUMBER);
if (allRows.moveToFirst()) {
do {
String name = allRows.getString(nameIdx);
String number = allRows.getString(phoneIdx);
//do something with name and number
} while(allRows.moveToNext());
}

• Requires: <uses-permission android:name="android.permission.READ_CONTACTS" />
l
l

Insert, Update, Delete

Similar to SQLiteDatabase

•
•
•
•
•

SQLiteDatabase myDb = openOrCreateDatabase(…);
ContentValues newValues = new ContentValues();
newValues.put("author", "David Janzen");
newValues.put("joke", "This is a joke");
myDb.insert("jokeTable",null,newValues);

•
•
•
•
•
•
•

ContentValues newValues = new ContentValues();
l
Update and Delete are similar
newValues.put("author", "David Janzen");
newValues.put("joke", "This is a joke");
getContentResolver().insert(MY_CONTENT_URI, newValues);
//or
//ContentValues[] valueArray = new ContentValues[10];
//getContentResolver().bulkInsert(MY_CONTENT_URI, valueArray);
l

Creating Your Own Content Provider

• public class MapProvider extends ContentProvider {
• private static final String mapURI =
•
“content://com.simexusa.provider.campusmaps/maps”;
• public static final Uri CONTENT_URI = Uri.parse(mapURI);
• @Override public boolean onCreate() {
•
//create the database and tables
• }
• //handle both forms of Content URIs (…/maps or …/maps/3 for third one)
• private static final int ALLROWS = 1;
• private static final int SINGLE_ROW = 2;
• private static final UriMatcher uriMatcher;
• static {
•
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
•
uriMatcher.addURI(“com.simexusa.provider.campusmaps”,”maps”,ALLROWS);
•
uriMatcher.addURI(“com.simexusa.provider.campusmaps”,”maps/#”,SINGLE_ROW);
• }
• }
l

Provide query, insert, delete, update

• @Override public Cursor query(Uri uri, String[] projection, String selection,
•
String[] selectionArgs, String sort) {
•
switch (uriMatcher.match(uri)) {
•
case SINGLE_ROW :
•
…
•
case ALLROWS :
•
…
•
default: :
•
…
•
}
•
return null;
• }
l

getType() and manifest

• @Override public String getType(Uri uri) {
•
switch (uriMatcher.match(uri)) {
•
case SINGLE_ROW :
•
return “vnd.simexusa.cursor.item/mapprovider”;
•
case ALLROWS :
•
l return “vnd.simexusa.cursor.dir/mapprovider”;
In ApplicationManifest.xml
•
default: :
•
throw new IllegalArgumentException(“Unsupported URI: “ + uri);
•
}
• }

• <provider android:name=“MapProvider”
•
android:authorities=“com.simexusa.provider.campusmap” />

Contenu connexe

Tendances

[Android] Data Storage
[Android] Data Storage[Android] Data Storage
[Android] Data StorageNikmesoft Ltd
 
Building node.js applications with Database Jones
Building node.js applications with Database JonesBuilding node.js applications with Database Jones
Building node.js applications with Database JonesJohn David Duncan
 
Learn PHP Lacture2
Learn PHP Lacture2Learn PHP Lacture2
Learn PHP Lacture2ADARSH BHATT
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programmingchhaichivon
 
Local data storage for mobile apps
Local data storage for mobile appsLocal data storage for mobile apps
Local data storage for mobile appsIvano Malavolta
 
Web scraping using scrapy - zekeLabs
Web scraping using scrapy - zekeLabsWeb scraping using scrapy - zekeLabs
Web scraping using scrapy - zekeLabszekeLabs Technologies
 
09.Local Database Files and Storage on WP
09.Local Database Files and Storage on WP09.Local Database Files and Storage on WP
09.Local Database Files and Storage on WPNguyen Tuan
 
Accessing data with android cursors
Accessing data with android cursorsAccessing data with android cursors
Accessing data with android cursorsinfo_zybotech
 
Brief introduction of Slick
Brief introduction of SlickBrief introduction of Slick
Brief introduction of SlickKnoldus Inc.
 
Softshake - Offline applications
Softshake - Offline applicationsSoftshake - Offline applications
Softshake - Offline applicationsjeromevdl
 

Tendances (20)

[Android] Data Storage
[Android] Data Storage[Android] Data Storage
[Android] Data Storage
 
Building node.js applications with Database Jones
Building node.js applications with Database JonesBuilding node.js applications with Database Jones
Building node.js applications with Database Jones
 
My sql tutorial-oscon-2012
My sql tutorial-oscon-2012My sql tutorial-oscon-2012
My sql tutorial-oscon-2012
 
SQLITE Android
SQLITE AndroidSQLITE Android
SQLITE Android
 
Learn PHP Lacture2
Learn PHP Lacture2Learn PHP Lacture2
Learn PHP Lacture2
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Jdbc Java Programming
Jdbc Java ProgrammingJdbc Java Programming
Jdbc Java Programming
 
Local data storage for mobile apps
Local data storage for mobile appsLocal data storage for mobile apps
Local data storage for mobile apps
 
Local Storage
Local StorageLocal Storage
Local Storage
 
Web scraping using scrapy - zekeLabs
Web scraping using scrapy - zekeLabsWeb scraping using scrapy - zekeLabs
Web scraping using scrapy - zekeLabs
 
Mysql all
Mysql allMysql all
Mysql all
 
09.Local Database Files and Storage on WP
09.Local Database Files and Storage on WP09.Local Database Files and Storage on WP
09.Local Database Files and Storage on WP
 
Accessing data with android cursors
Accessing data with android cursorsAccessing data with android cursors
Accessing data with android cursors
 
Brief introduction of Slick
Brief introduction of SlickBrief introduction of Slick
Brief introduction of Slick
 
Softshake - Offline applications
Softshake - Offline applicationsSoftshake - Offline applications
Softshake - Offline applications
 
Oak Lucene Indexes
Oak Lucene IndexesOak Lucene Indexes
Oak Lucene Indexes
 
Sequelize
SequelizeSequelize
Sequelize
 
Hive commands
Hive commandsHive commands
Hive commands
 
Drupal 7 database api
Drupal 7 database api Drupal 7 database api
Drupal 7 database api
 
REST Basics
REST BasicsREST Basics
REST Basics
 

En vedette

Infinum Android Talks #04 - Google Maps Android API utility library
Infinum Android Talks #04 - Google Maps Android API utility libraryInfinum Android Talks #04 - Google Maps Android API utility library
Infinum Android Talks #04 - Google Maps Android API utility libraryDenis_infinum
 
Android application for gps
Android application for gpsAndroid application for gps
Android application for gpsSutej Chakka
 

En vedette (6)

Map
MapMap
Map
 
Deployment
DeploymentDeployment
Deployment
 
Getting started
Getting startedGetting started
Getting started
 
Application lifecycle
Application lifecycleApplication lifecycle
Application lifecycle
 
Infinum Android Talks #04 - Google Maps Android API utility library
Infinum Android Talks #04 - Google Maps Android API utility libraryInfinum Android Talks #04 - Google Maps Android API utility library
Infinum Android Talks #04 - Google Maps Android API utility library
 
Android application for gps
Android application for gpsAndroid application for gps
Android application for gps
 

Similaire à Persistences

Android Lab Test : Reading the foot file list (english)
Android Lab Test : Reading the foot file list (english)Android Lab Test : Reading the foot file list (english)
Android Lab Test : Reading the foot file list (english)Bruno Delb
 
Get docs from sp doc library
Get docs from sp doc libraryGet docs from sp doc library
Get docs from sp doc librarySudip Sengupta
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenchesIsmail Mayat
 
Big data, just an introduction to Hadoop and Scripting Languages
Big data, just an introduction to Hadoop and Scripting LanguagesBig data, just an introduction to Hadoop and Scripting Languages
Big data, just an introduction to Hadoop and Scripting LanguagesCorley S.r.l.
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes WorkshopErik Hatcher
 
Information Retrieval - Data Science Bootcamp
Information Retrieval - Data Science BootcampInformation Retrieval - Data Science Bootcamp
Information Retrieval - Data Science BootcampKais Hassan, PhD
 
Wiesław Kałkus: C# functional programming
Wiesław Kałkus: C# functional programmingWiesław Kałkus: C# functional programming
Wiesław Kałkus: C# functional programmingAnalyticsConf
 
OOP Adventures with XOOPS
OOP Adventures with XOOPSOOP Adventures with XOOPS
OOP Adventures with XOOPSxoopsproject
 
Hands On Spring Data
Hands On Spring DataHands On Spring Data
Hands On Spring DataEric Bottard
 
04 darwino concepts and utility classes
04   darwino concepts and utility classes04   darwino concepts and utility classes
04 darwino concepts and utility classesdarwinodb
 
Using Document Databases with TYPO3 Flow
Using Document Databases with TYPO3 FlowUsing Document Databases with TYPO3 Flow
Using Document Databases with TYPO3 FlowKarsten Dambekalns
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartGabriele Lana
 
Modules Building Presentation
Modules Building PresentationModules Building Presentation
Modules Building Presentationhtyson
 
springdatajpa-up.pdf
springdatajpa-up.pdfspringdatajpa-up.pdf
springdatajpa-up.pdfssuser0562f1
 

Similaire à Persistences (20)

Android Lab Test : Reading the foot file list (english)
Android Lab Test : Reading the foot file list (english)Android Lab Test : Reading the foot file list (english)
Android Lab Test : Reading the foot file list (english)
 
Get docs from sp doc library
Get docs from sp doc libraryGet docs from sp doc library
Get docs from sp doc library
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenches
 
Android Database
Android DatabaseAndroid Database
Android Database
 
Big data, just an introduction to Hadoop and Scripting Languages
Big data, just an introduction to Hadoop and Scripting LanguagesBig data, just an introduction to Hadoop and Scripting Languages
Big data, just an introduction to Hadoop and Scripting Languages
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes Workshop
 
Information Retrieval - Data Science Bootcamp
Information Retrieval - Data Science BootcampInformation Retrieval - Data Science Bootcamp
Information Retrieval - Data Science Bootcamp
 
Wiesław Kałkus: C# functional programming
Wiesław Kałkus: C# functional programmingWiesław Kałkus: C# functional programming
Wiesław Kałkus: C# functional programming
 
OOP Adventures with XOOPS
OOP Adventures with XOOPSOOP Adventures with XOOPS
OOP Adventures with XOOPS
 
Hands On Spring Data
Hands On Spring DataHands On Spring Data
Hands On Spring Data
 
Moose
MooseMoose
Moose
 
04 darwino concepts and utility classes
04   darwino concepts and utility classes04   darwino concepts and utility classes
04 darwino concepts and utility classes
 
Tornadoweb
TornadowebTornadoweb
Tornadoweb
 
Using Document Databases with TYPO3 Flow
Using Document Databases with TYPO3 FlowUsing Document Databases with TYPO3 Flow
Using Document Databases with TYPO3 Flow
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
 
Modules Building Presentation
Modules Building PresentationModules Building Presentation
Modules Building Presentation
 
Power tools in Java
Power tools in JavaPower tools in Java
Power tools in Java
 
springdatajpa-up.pdf
springdatajpa-up.pdfspringdatajpa-up.pdf
springdatajpa-up.pdf
 
Building a Search Engine Using Lucene
Building a Search Engine Using LuceneBuilding a Search Engine Using Lucene
Building a Search Engine Using Lucene
 

Dernier

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 

Dernier (20)

2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 

Persistences

  • 2. l l l Persistence Three ways to store data l Shared Preferences l Files l SQLite databases Mechanism to store/access private data l Content Providers
  • 3. l l Shared Preferences Three forms: l Share across all components in an application l getSharedPreferences(“SomeString”,Activity.MODE_PRIVATE); l Store only data needed by this Activity l l l l getPreferences(Activity.MODE_PRIVATE); Store only data needed by this Activity when Activity becomes inactive (but not when finished) Ex. Orientation change from portrait to landscape use Bundle in onSaveInstanceState/onRestoreInstanceState/onCreate
  • 4. l l Shared Preferences Across all components • public static final String CMPREFS = "CampusMapSharedPreferences"; • • • • • • • • • • • • • • private void savePreferences() { SharedPreferences cmSharedPreferences = getSharedPreferences(CMPREFS,Activity.MODE_PRIVATE); SharedPreferences.Editor editor = cmSharedPreferences.edit(); editor.putBoolean(VIRTUAL_MODE, inVirtualMode); editor.putInt(MAP_INDEX, curMapIndex); editor.commit(); } private void restoreUIState() { SharedPreferences cmSharedPreferences = getSharedPreferences(CMPREFS,Activity.MODE_PRIVATE); inVirtualMode = cmSharedPreferences.getBoolean(VIRTUAL_MODE, true); curMapIndex = cmSharedPreferences.getInt(MAP_INDEX, 0); }
  • 5. l l Shared Preferences Only for this Activity (each Activity has one) • • • • • • • • • • • • • • private void savePreferences() { SharedPreferences cmActivityPreferences = getPreferences(Activity.MODE_PRIVATE); SharedPreferences.Editor editor = cmActivityPreferences.edit(); editor.putBoolean(VIRTUAL_MODE, inVirtualMode); editor.putInt(MAP_INDEX, curMapIndex); editor.commit(); } private void restoreUIState() { SharedPreferences cmActivityPreferences = getPreferences(Activity.MODE_PRIVATE); inVirtualMode = cmActivityPreferences.getBoolean(VIRTUAL_MODE, true); curMapIndex = cmActivityPreferences.getInt(MAP_INDEX, 0); }
  • 6. l l Shared Preferences Only for this Activity when inactive/active l Note: onSaveInstanceState called when an Activity becomes inactive, not when closed by finish() or user pressing back button • public static final String TEXTVIEW_STATE_KEY = “TEXTVIEW_STATE_KEY"; • • • • • • • • • • • private void onSaveInstanceState(Bundle outState) { outState.putString(TEXTVIEW_STATE_KEY, (TextView)findViewById(R.id.myTextView).getText().toString()); super.onSaveInstanceState(outState); } private void onRestoreInstanceState(Bundle inState) { //same for onCreate() if(inState != null && inState.containsKey(TEXTVIEW_STATE_KEY)) { (TextView)findViewById(R.id.myTextView). setText(inState.getString(TEXTVIEW_STATE_KEY)); } }
  • 7. l l l Files Generally not recommended to use files Store read-only static files in res/raw • InputStream myFile = getResources().openRawResource(R.raw.myfilename);
  • 8. l l l Files Generally not recommended to use files Store read-only static files in res/raw • InputStream myFile = getResources().openRawResource(R.raw.myfilename);
  • 9. l l l Files Standard java.io is available Can also use openFileOutput and openFileInput • byte[] b = new String("Yo").getBytes(); • Also available: • Context.MODE_PRIVATE • try { • Context.MODE_WORLD_READABLE • FileOutputStream fos = • openFileOutput("anotherExampleFile.txt", • Context.MODE_WORLD_WRITEABLE); • fos.write(b); • FileInputStream fis = • openFileInput("anotherExampleFile.txt"); • fis.read(b); • } catch (IOException e) {}
  • 10. l l l l l SQLite Databases RDBMS provided through a library so it becomes part of your app Use the SQL you learned in database course Use Db best practices l Normalize data l Encapsulate db info in helper or wrapper classes Don’t store files (e.g. images or audio) l Instead store the path string
  • 11. l Creating a Database • SQLiteDatabase myDb = • openOrCreateDatabase("example.db", • Context.MODE_PRIVATE, • null); //optional CursorFactory • myDb.execSQL("drop table if exists jokeTable"); • myDb.execSQL("create table jokeTable " + • " ( _id integer primary key autoincrement," + • "author text not null, joke text not null);");
  • 12. l l l • • • • Inserting Data ContentValues are key/value pairs that are used when inserting/updating databases Each ContentValue object corresponds to one row in a table ContentValues newValues = new ContentValues(); newValues.put("author", "David Janzen"); newValues.put("joke", "This is a joke"); myDb.insert("jokeTable",null,newValues);
  • 13. l Updating Data • ContentValues updatedValues = new ContentValues(); • updatedValues.put("joke", "This is a better joke"); • myDb.update("jokeTable", • updatedValues, • "author='David Janzen'", //where clause • null); //whereArgs
  • 14. l • • • • • • • • • • • • • • • Querying Data with query() Cursor jokes = myDb.query("jokeTable", null, //columns null, //where clause null, //args if ? in where clause null, //groupBy null, //having null); //orderBy if (jokes.moveToFirst()) { do { String author = jokes.getString(1); String joke = jokes.getString(2); ((TextView)findViewById(R.id.hello)).setText(author + ": " + joke); } while(jokes.moveToNext()); }
  • 17. l l l l Content Providers Apps can expose their data layer through a Content Provider, identified by a URI Some native apps provide Content Providers Your apps can provide Content Providers
  • 18. l l • • • • • • • • • • • • Content Resolver Each application Context has a single ContentResolver that can be used to access a Content Provider • URI,colums,where,whereArgs,orderBy Cursor allRows = getContentResolver().query( People.CONTENT_URI, null, null, null, null); startManagingCursor(allRows); int nameIdx = allRows.getColumnIndexOrThrow(People.NAME); int phoneIdx = allRows.getColumnIndexOrThrow(People.NUMBER); if (allRows.moveToFirst()) { do { String name = allRows.getString(nameIdx); String number = allRows.getString(phoneIdx); //do something with name and number } while(allRows.moveToNext()); } • Requires: <uses-permission android:name="android.permission.READ_CONTACTS" />
  • 19. l l Insert, Update, Delete Similar to SQLiteDatabase • • • • • SQLiteDatabase myDb = openOrCreateDatabase(…); ContentValues newValues = new ContentValues(); newValues.put("author", "David Janzen"); newValues.put("joke", "This is a joke"); myDb.insert("jokeTable",null,newValues); • • • • • • • ContentValues newValues = new ContentValues(); l Update and Delete are similar newValues.put("author", "David Janzen"); newValues.put("joke", "This is a joke"); getContentResolver().insert(MY_CONTENT_URI, newValues); //or //ContentValues[] valueArray = new ContentValues[10]; //getContentResolver().bulkInsert(MY_CONTENT_URI, valueArray);
  • 20. l Creating Your Own Content Provider • public class MapProvider extends ContentProvider { • private static final String mapURI = • “content://com.simexusa.provider.campusmaps/maps”; • public static final Uri CONTENT_URI = Uri.parse(mapURI); • @Override public boolean onCreate() { • //create the database and tables • } • //handle both forms of Content URIs (…/maps or …/maps/3 for third one) • private static final int ALLROWS = 1; • private static final int SINGLE_ROW = 2; • private static final UriMatcher uriMatcher; • static { • uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); • uriMatcher.addURI(“com.simexusa.provider.campusmaps”,”maps”,ALLROWS); • uriMatcher.addURI(“com.simexusa.provider.campusmaps”,”maps/#”,SINGLE_ROW); • } • }
  • 21. l Provide query, insert, delete, update • @Override public Cursor query(Uri uri, String[] projection, String selection, • String[] selectionArgs, String sort) { • switch (uriMatcher.match(uri)) { • case SINGLE_ROW : • … • case ALLROWS : • … • default: : • … • } • return null; • }
  • 22. l getType() and manifest • @Override public String getType(Uri uri) { • switch (uriMatcher.match(uri)) { • case SINGLE_ROW : • return “vnd.simexusa.cursor.item/mapprovider”; • case ALLROWS : • l return “vnd.simexusa.cursor.dir/mapprovider”; In ApplicationManifest.xml • default: : • throw new IllegalArgumentException(“Unsupported URI: “ + uri); • } • } • <provider android:name=“MapProvider” • android:authorities=“com.simexusa.provider.campusmap” />