Autore Topic: Salvare preferenze in DB  (Letto 439 volte)

Offline DHD

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    m7
  • Sistema operativo:
    Win 8.1
Salvare preferenze in DB
« il: 13 Settembre 2014, 20:47:31 CEST »
0
Salve a tutti.
Vorrei salvare delle preferenze in un db così per poterle impostare al boot.
Ho creato la classe DatabaseHandler:
Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.List;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DatabaseHandler extends SQLiteOpenHelper {
 
    // All Static variables
    // Database Version
    private static final int DATABASE_VERSION = 1;
 
    // Database Name
    private static final String DATABASE_NAME = "eXConfigurator";
 
    // Contacts table name
    private static final String TABLE_CONTACTS = "valoriBoot";
 
    // Contacts Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_VALUE = "value";
    private static final String KEY_FILENAME = "filename";
    private static final String KEY_CAT = "category";
   
 
    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 
    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_VALUE + " TEXT," + KEY_FILENAME + " TEXT," + KEY_CAT + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }
 
    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
 
        // Create tables again
        onCreate(db);
    }
 
    /**
     * All CRUD(Create, Read, Update, Delete) Operations
     */

 
    // Adding new contact
    public void addItem(DataItem item) {
        SQLiteDatabase db = this.getWritableDatabase();
 
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, item.getName()); // Contact Name
        values.put(KEY_VALUE, item.getValue()); // Contact Phone
        values.put(KEY_FILENAME, item.getFileName());
        values.put(KEY_CAT, item.getCategory());
 
        // Inserting Row
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Closing database connection
    }
 
    // Getting single contact
    DataItem getItem(int id) {
        SQLiteDatabase db = this.getReadableDatabase();
 
        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_VALUE, KEY_FILENAME, KEY_CAT }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
        if (cursor != null)
            cursor.moveToFirst();
 
        DataItem item = new DataItem(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4));
        // return contact
        return item;
    }
     
    // Getting All Contacts
    public List<DataItem> getAllItems() {
        List<DataItem> contactList = new ArrayList<DataItem>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
 
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
 
        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                DataItem item = new DataItem();
                item.setID(Integer.parseInt(cursor.getString(0)));
                item.setName(cursor.getString(1));
                item.setValue(cursor.getString(2));
                item.setFileName(cursor.getString(3));
                item.setCategory(cursor.getString(4));
                // Adding contact to list
                contactList.add(item);
            } while (cursor.moveToNext());
        }
 
        // return contact list
        return contactList;
    }
 
    // Updating single contact
    public int updateItem(DataItem item) {
        SQLiteDatabase db = this.getWritableDatabase();
 
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, item.getName());
        values.put(KEY_VALUE, item.getValue());
        values.put(KEY_FILENAME, item.getFileName());
        values.put(KEY_CAT, item.getCategory());
 
        // updating row
        return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(item.getID()) });
    }
 
    // Deleting single item by ID
    public void deleteItem(DataItem item) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
                new String[] { String.valueOf(item.getID()) });
        db.close();
    }
   
    public void deleteItemByName(String name)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_NAME + " = ?" , new String[] {name});
        db.close();
    }
   
    public void deleteItemById(int ID)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?" , new String[] {String.valueOf(ID)});
        db.close();
    }
 
 
    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        int count = cursor.getCount();
        cursor.close();
 
        // return count
        return count;
    }
 
   
    public void deleteAllItems() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, null, null);
        db.close();
    }
}

Fatto questo, ho creato una variabile nella MainActivity:
Codice (Java): [Seleziona]
public static DatabaseHandler db;
e nella onCreate l'ho "inizializzata":
Codice (Java): [Seleziona]
db = new DatabaseHandler(this);
Poi nella classe Display (è un HtcPreferenceFragment, uso le API OpenSense :P) mi sono creato la variabile:
Codice: [Seleziona]
private static DatabaseHandler db = MainActivity.db;e alla modifica di uno switch, cambio il valore, con questo metodo:
Codice (Java): [Seleziona]
private static void updateListDb(final HtcPreference p, final String value) {

                        class LongOperation extends AsyncTask<String, Void, String> {

                                @Override
                                protected String doInBackground(String... params) {

                                                List<DataItem> items = db.getAllItems();
                                                for(DataItem item : items) {
                                                        if(item.getName().equals("'"+p.getKey()+"'")) {
                                                                db.deleteItemByName("'"+p.getKey()+"'");
                                                        }
                                                }
                                                db.addItem(new DataItem("'"+p.getKey()+"'", value, p.getTitle().toString(), category));
                                                Log.d(Constants.TAG, p.getKey() + " " + value);

                                        return "Executed";
                                }
                                @Override
                                protected void onPostExecute(String result) {

                                }
                        }
                        new LongOperation().execute();
                }

e fin qui tutto ok.
Ho aggiunto anche un'altro metodo per poter settare se lo switch è on o off e lo gestisco con questo metodo:
Codice (Java): [Seleziona]
static String valore;
          private static boolean ReadPref(final String key) {
                  //final String valore = null;
                  class LongOperation extends AsyncTask<String, Void, String> {
                                @Override
                                protected String doInBackground(String... params) {
                                                List<DataItem> items = db.getAllItems();
                                                for(DataItem item : items) {
                                                        if(item.getName().equals("'"+key+"'")) {
                                                                //db.deleteItemByName("'"+p.getKey()+"'");
                                                                valore = item.getValue();
                                                        }
                                                }
                                               
                                                if (valore==null) {
                                                        valore = "false";
                                                }
                                               
                                        //return "Executed";
                                                Log.d(Constants.TAG, "Value Boot: " + valore.toString());
                                                return valore;
                                }
                        }
                        new LongOperation().execute();
                        //String valore;
                        //Boolean Val = (Boolean) valore.toString();
                        return Boolean.parseBoolean(valore);
                       
          }
però ho un problema: se clicco sullo switch e esco dall'app premendo indietro, e la riapro lo switch lo ritrovo come l'avevo lasciato, altrimenti se "killo" il processo (o dal task manager o altro) lo switch è su off.

Grazie per le risposte.

Edit: ho un'altro quesito. Per applicare lo stato dello switch all'avvio dell'app, è necessario usare un db ?
Ed inoltre, come posso cercare un determinato elemento nel db ?
Grazie ancora

Offline tonno16

  • Utente storico
  • *****
  • Post: 1224
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Salvare preferenze in DB
« Risposta #1 il: 14 Settembre 2014, 02:22:12 CEST »
0
Nulla vieta l'uso di un DB per mantenere delle impostazioni.
Anzi. Se sai usare SQLite e non è difficile puoi farlo.
Per la questione dello switch ti basta fare un metodo che ritorna true o false e impostare con setChecked().

Comunque esistono le shared oreferences. Ti consiglio di guardarle

Offline DHD

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    m7
  • Sistema operativo:
    Win 8.1
Re:Salvare preferenze in DB
« Risposta #2 il: 14 Settembre 2014, 10:55:49 CEST »
0
Nulla vieta l'uso di un DB per mantenere delle impostazioni.
Anzi. Se sai usare SQLite e non è difficile puoi farlo.
Per la questione dello switch ti basta fare un metodo che ritorna true o false e impostare con setChecked().

Comunque esistono le shared oreferences. Ti consiglio di guardarle

Credo di aver risolto così:
Codice (Java): [Seleziona]
boot_display.setChecked(ReadPref("boot_display"));Per ora non ne sono sicuro, verificherò e appena sarò sicuro, marcherò il topic come risolto :D