Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:dydaktyka:aml:lab3 [2013/09/27 09:00]
esimon utworzono
pl:dydaktyka:aml:lab3 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
-====== Dostęp do danych w Androidzie ====== +====== Dostęp do danych ​GPS w Androidzie ====== 
-  // ​Zintegruj program ​aml_gpstracker ​z projektem ​gui aml_ambientprofile ​tak, aby: +===== Ambient Profile ===== 
-  // ​pierwszy ​fragment umożliwiał włączanie i wyłączanie usługi śledzenia ​i wyświetlał aktualnie włączony profil+Zintegruj program ​[[https://​sbobek@bitbucket.org/​sbobek/​aml_gpstracker_studio|GPS Tracker]] ​z projektem ​GUI [[https://​sbobek@bitbucket.org/​sbobek/​aml_ambientprofile|Ambient Profile]]tak aby: 
-  ​// - drugi fragment wyświetlał ​ListView z lista profili jakie ma użytkownik ​+ możliwość dodania nowych+ 
-  ​// - (zadanie na przyszły wykład) trzeci ​fragment ​zawierał ​wyświetlał mapę z aktualną lokalizacją i next ikonkami poszczególnych miejsc-profili +{{:​pl:​dydaktyka:​aml:​ambient-profile.png?​300 |}}  
-  // Zintegruj bazę danych tak aby umożliwić zapisywanie/odczytywanie profili ​+  * Pierwszy ​fragment ​(**Status**) ​umożliwiał włączanie i wyłączanie usługi śledzenia. 
 +  ​* Drugi fragment ​(**Profiles**) ​wyświetlał ​listę ​profili jakie użytkownik ​aktualnie ma. Dodaj przycisk i aktywność (FragmentDialog) umożliwiający dodanie nowego profilu**Zaprojektuj** klasę reprezentującą profil, przechowującą różne rodzaje profilu (nazwa, co ma się dziać kiedy profil jest aktywny) 
 +  ​* Przetestuj działanie aplikacji za pomocą DDMS 
 +  * **Zadanie dodatkowe** Trzeci ​fragment ​(Map) wyświetlać powinien ​mapę z ikonami ​profili ​w obszarach ich aktywacji 
 +  ​* **Zadanie dodatkowe** Do detekcji tego czy ktoś pojawił się w obszarze aktywacji danego profilu wykorzystaj ​//geopłoty// [[http://​developer.android.com/​training/​location/​geofencing.html|Geofences]] 
 +   
 +===== Baza danych ===== 
 +Dodaj do projektu klasy odpowiedzialne za zapisywanie i odczyt profili użytkownika z i do bazy SQLite. 
 +Poniżej znajdują się przykłady takich klas do przechowywania ​danych ​GPS. **Zmodyfikuj** je tak aby umożliwiały przechowywanie profili zaprojektowanych w poprzednim ​ćwiczeniu. 
 + 
 +Przykładowe wykorzystanie klas poniżej: 
 +<code java> 
 +//W onCreate tworzymy uchwyt do źródła danych 
 +GPSDataSource datasource = new GPSDataSource(getBaseContext());​ 
 +datasource.open();​ 
 + 
 +//Gdzieś dalej w kodzie wrzucamy dane do bazy: 
 +if(datasource != null){ 
 +  datasource.createGPSEntry( 
 +     ​currentLocation.getLatitude(),​  
 +     ​currentLocation.getLongitude(),​ 
 +     ​Long.toString(currentTime),​ 
 +     ​refreshFrequency,​  
 +     ​batteryLevel 
 +  ); 
 + 
 +//Zamykamy źródło danych w onStop albo onDestroy 
 +datasource.close();​ 
 +</​code>​ 
 +==== GPS ==== 
 +Poniżej klasa reprezentująca rekord danych. 
 +<file java GPS.java>​ 
 +public class GPS { 
 +    private long id; 
 +    private double lat; 
 +    private double lon; 
 +    private String timestamp;​ 
 +    private int frequency;​ 
 +    private int battery; 
 + 
 +    double getLat() { return lat;} 
 +    void setLat(double lat) { this.lat = lat; } 
 +    double getLon() { return lon;} 
 +    void setLon(double lon) { this.lon = lon;} 
 +    String getTimestamp() { return timestamp; } 
 +    void setTimestamp(String timestamp) { this.timestamp = timestamp; } 
 +    public long getId() { return id; } 
 +    public void setId(long id) { this.id = id; } 
 +    public int getBattery() { return battery; } 
 +    public void setBattery(int battery) { this.battery = battery; } 
 +    public int getFrequency() { return frequency; } 
 +    public void setFrequency(int frequency) {this.frequency = frequency; } 
 + 
 +
 + 
 +</​file>​ 
 + 
 +==== DataBaseHelper ==== 
 +Poniżej klasa służąca za uchwyt do bazy danych. 
 +Tworzy bazę danych i umożliwia operację na tabelach i danych. 
 +Jest wykorzystywana przez klasę //​GPSDataSource//​. 
 +<file java DataBaseHelper.java>​ 
 +import android.content.Context;​ 
 + 
 +import android.database.sqlite.SQLiteDatabase;​ 
 +import android.database.sqlite.SQLiteOpenHelper;​ 
 + 
 +import android.util.Log;​ 
 + 
 +public class DataBaseHelper extends SQLiteOpenHelper { 
 + 
 +  public static final String TABLE_GPS = "​gps";​ 
 +  public static final String COLUMN_ID = "​_id";​ 
 +  public static final String COLUMN_LAT = "​lat";​ 
 +  public static final String COLUMN_LON = "​lon";​ 
 +  public static final String COLUMN_TIME = "​timestamp";​ 
 +  public static final String COLUMN_FREQUENCY = "​frequency";​ 
 +  public static final String COLUMN_BATTERY_LEVEL = "​battery";​ 
 + 
 +  public ​ static final String DATABASE_NAME = "​gps.db";​ 
 +   
 +   
 +  private static final int DATABASE_VERSION = 1; 
 + 
 +  // Database creation sql statement 
 +  private static final String DATABASE_CREATE = "​create table " 
 +      + TABLE_GPS + "​("​ + COLUMN_ID + " integer primary key autoincrement,​ " ​  
 +      + COLUMN_LAT + " double not null, " 
 +      + COLUMN_LON + " double not null, " 
 +      + COLUMN_TIME + " text not null, " 
 +      + COLUMN_FREQUENCY + " int not null,"​ 
 +      + COLUMN_BATTERY_LEVEL + " integer default 0);";​ 
 + 
 +  public DataBaseHelper(Context context) { 
 +    super(context,​ DATABASE_NAME,​ null, DATABASE_VERSION);​ 
 +  } 
 + 
 +  @Override 
 +  public void onCreate(SQLiteDatabase database) { 
 +      database.execSQL(DATABASE_CREATE);​ 
 +  } 
 + 
 +  @Override 
 +  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
 +    Log.w(DataBaseHelper.class.getName(),​ 
 +        "​Upgrading database from version " + oldVersion + " to " 
 +            + newVersion + ", which will destroy all old data"​);​ 
 +    db.execSQL("​DROP TABLE IF EXISTS " + TABLE_GPS);​ 
 +    onCreate(db);​ 
 +  } 
 + 
 +}  
 + 
 +</​file>​ 
 + 
 + 
 +==== GPSDataSource ==== 
 +Klasa opakowuje klasę //​DataBaseHelper//​ udostępniając interfejs dedykowany dla operacji na obiektach klasy //GPS//. 
 + 
 +<file java GPSDataSource.java>​ 
 +import java.util.ArrayList;​ 
 +import java.util.List;​ 
 + 
 +import android.content.ContentValues;​ 
 +import android.content.Context;​ 
 +import android.database.Cursor;​ 
 +import android.database.SQLException;​ 
 +import android.database.sqlite.SQLiteDatabase;​ 
 + 
 +public class GPSDataSource { 
 + 
 +  // Database fields 
 +  private SQLiteDatabase database; 
 +  private DataBaseHelper dbHelper; 
 +  private String[] allColumns = { DataBaseHelper.COLUMN_ID,​ 
 +                  DataBaseHelper.COLUMN_LAT,​  
 +                  DataBaseHelper.COLUMN_LON,​ 
 +                  DataBaseHelper.COLUMN_TIME,​ 
 +                  DataBaseHelper.COLUMN_FREQUENCY,​ 
 +                  DataBaseHelper.COLUMN_BATTERY_LEVEL};​ 
 + 
 +  public GPSDataSource(Context context) { 
 +    dbHelper = new DataBaseHelper(context);​ 
 +  } 
 + 
 +  public void open() throws SQLException { 
 +    database = dbHelper.getWritableDatabase();​ 
 +  } 
 + 
 +  public void close() { 
 +    dbHelper.close();​ 
 +  } 
 + 
 +  public GPS createGPSEntry(double lat, double lon, String timestamp, int frequency, int battery) { 
 +    ContentValues values = new ContentValues();​ 
 +    values.put(DataBaseHelper.COLUMN_LAT,​ lat); 
 +    values.put(DataBaseHelper.COLUMN_LON,​ lon); 
 +    values.put(DataBaseHelper.COLUMN_TIME,​ timestamp);​ 
 +    values.put(DataBaseHelper.COLUMN_LON,​ lon); 
 +    values.put(DataBaseHelper.COLUMN_FREQUENCY,​ frequency);​ 
 +    values.put(DataBaseHelper.COLUMN_BATTERY_LEVEL,​ battery); 
 +     
 +    long insertId = database.insert(DataBaseHelper.TABLE_GPS,​ null, 
 +        values); 
 +     
 +    Cursor cursor = database.query(DataBaseHelper.TABLE_GPS,​ 
 +        allColumns, DataBaseHelper.COLUMN_ID + " = " + insertId, null, 
 +        null, null, null); 
 +    cursor.moveToFirst();​ 
 +    GPS newGPS = cursorToGPS(cursor);​ 
 +    cursor.close();​ 
 +    return newGPS; 
 +  } 
 + 
 +  public void deleteGPS(GPS gps) { 
 +    long id = gps.getId();​ 
 + 
 +    database.delete(DataBaseHelper.TABLE_GPS,​ DataBaseHelper.COLUMN_ID 
 +        + " = " + id, null); 
 +  } 
 + 
 +  public List<​GPS>​ getAllGPS() { 
 +    List<​GPS>​ gpses = new ArrayList<​GPS>​();​ 
 + 
 +    Cursor cursor = database.query(DataBaseHelper.TABLE_GPS,​ 
 +        allColumns, null, null, null, null, null); 
 + 
 +    if(cursor.moveToFirst()){ 
 +      while (!cursor.isAfterLast()) { 
 +        GPS gps = cursorToGPS(cursor);​ 
 +        gpses.add(gps);​ 
 +        cursor.moveToNext();​ 
 +      } 
 +    } 
 +    // Make sure to close the cursor 
 +    cursor.close();​ 
 +    return gpses; 
 +  } 
 + 
 +  private GPS cursorToGPS(Cursor cursor) { 
 +    GPS gps = null; 
 +    if (cursor != null) { 
 +       gps = new GPS();  
 +       ​gps.setId(cursor.getLong(0));​ 
 +       ​gps.setLat(cursor.getDouble(cursor.getColumnIndex(DataBaseHelper.COLUMN_LAT)));​ 
 +       ​gps.setLon(cursor.getDouble(cursor.getColumnIndex(DataBaseHelper.COLUMN_LON)));​ 
 +       ​gps.setTimestamp(cursor.getString(cursor.getColumnIndex(DataBaseHelper.COLUMN_TIME)));​ 
 +       ​gps.setFrequency(cursor.getInt(cursor.getColumnIndex(DataBaseHelper.COLUMN_FREQUENCY)));​ 
 +       ​gps.setBattery(cursor.getInt(cursor.getColumnIndex(DataBaseHelper.COLUMN_BATTERY_LEVEL)));​ 
 +    }  
 +    return gps; 
 +  } 
 +}  
 +</​file>​ 
 + 
 + 
 + 
 + 
 + 
 + 
  
pl/dydaktyka/aml/lab3.1380265233.txt.gz · ostatnio zmienione: 2019/06/27 15:51 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0