samedi 12 mars 2016

Listening for changes on data source in SQLite and updating activity list view accordingly

Hello I am new to android and I currently want to implement something but do not know how to go about it. I have a service that runs in the background, it gets data from a live server and stores in an SQLite database in the app. The reason for this is I need the user to be able to access that data without having to be online.

Now After the data has been stored in the SQLite database inside the service I would like my MainActivity which contains a ListView to be able to detect any new changes that have been made on that table and display the new changes.

This is my LocalDBOpenHelper.java class:

package com.xxxxxx.eventmanager.db;

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

public class LocalDBOpenHelper extends SQLiteOpenHelper {

    private static final String LOGTAG = "MTGH_DB_LOG";

    private static final String DATABASE_NAME = "mtgh.db";
    private static final int DATABASE_VERSION = 3;

    public static final String TABLE_APP_PREFERENCES = "app_info";
    public static final String TABLE_ORGANISER = "organiser";
    public static final String TABLE_EVENTS = "events";
    public static final String TABLE_PURCHASE_INVOICES = "purchase_invoices";

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

    @Override
    public void onCreate(SQLiteDatabase db) {

        /* CREATE APP_INFO TABLE */
        StringBuilder create_app_preferences_table = new StringBuilder();
        create_app_preferences_table.append("CREATE TABLE `app_preferences` (");
        create_app_preferences_table.append("`id` INT NOT NULL, ");
        create_app_preferences_table.append("`name` VARCHAR(32) NULL, ");
        create_app_preferences_table.append("`value` TEXT NULL, ");
        create_app_preferences_table.append("PRIMARY KEY (`id`));");
        db.execSQL(create_app_preferences_table.toString());
        Log.i(LOGTAG,  "App Preferences Table has been created");

        /* CREATE ORGANISER TABLE */
        StringBuilder create_organiser_table = new StringBuilder();
        create_organiser_table.append("CREATE TABLE `organiser` (");
        create_organiser_table.append("`id` INT NOT NULL, ");
        create_organiser_table.append("`name` VARCHAR(64) NULL, ");
        create_organiser_table.append("`email` VARCHAR(32) NULL, ");
        create_organiser_table.append("`phone` VARCHAR(16) NULL, ");
        create_organiser_table.append("`address` TEXT NULL, ");
        create_organiser_table.append("PRIMARY KEY (`id`));");
        db.execSQL(create_organiser_table.toString());
        Log.i(LOGTAG,  "Organiser Table has been created");

        /* CREATE EVENTS TABLE */
        StringBuilder create_events_table = new StringBuilder();
        create_events_table.append("CREATE TABLE `events` (");
        create_events_table.append("`id` INT NOT NULL, ");
        create_events_table.append("`banners` text NOT NULL, ");
        create_events_table.append("`name` VARCHAR(64) NOT NULL, ");
        create_events_table.append("`description` text NOT NULL, ");
        create_events_table.append("`category_id` int(11) NOT NULL, ");
        create_events_table.append("`venue` varchar(256) NOT NULL, ");
        create_events_table.append("`map_embed` text, ");
        create_events_table.append("`date` date NOT NULL, ");
        create_events_table.append("`date_parts` varchar(64) DEFAULT NULL, ");
        create_events_table.append("`time` time NOT NULL, ");
        create_events_table.append("`total_no_of_tickets` int(11) NOT NULL, ");
        create_events_table.append("`no_of_available_tickets` int(11) NOT NULL, ");
        create_events_table.append("`sales_end_date` date DEFAULT NULL, ");
        create_events_table.append("`tickets` text NOT NULL, ");
        create_events_table.append("`organiser_id` smallint(6) NOT NULL, ");
        create_events_table.append("`slug` varchar(256) NOT NULL, ");
        create_events_table.append("`is_active` tinyint(4) DEFAULT '0', ");
        create_events_table.append("`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, ");
        create_events_table.append("`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, ");
        create_events_table.append("PRIMARY KEY (`id`));");
        db.execSQL(create_events_table.toString());
        Log.i(LOGTAG,  "Events Table has been created");

        /* CREATE PURCHASE_INVOICES TABLE */
        StringBuilder create_purchase_invoices_table = new StringBuilder();
        create_purchase_invoices_table.append("CREATE TABLE `purchase_invoice_details` (");
        create_purchase_invoices_table.append("`id` int(11) NOT NULL, ");
        create_purchase_invoices_table.append("`user_id` int(11) DEFAULT '0', ");
        create_purchase_invoices_table.append("`type` varchar(16) NOT NULL, ");
        create_purchase_invoices_table.append("`vendor_id` tinyint(4) NOT NULL, ");
        create_purchase_invoices_table.append("`vendor_name` varchar(32) NOT NULL, ");
        create_purchase_invoices_table.append("`reference_code` varchar(16) NOT NULL, ");
        create_purchase_invoices_table.append("`total_no_of_tickets` int(11) NOT NULL, ");
        create_purchase_invoices_table.append("`total_tickets_amount` float NOT NULL DEFAULT '0', ");
        create_purchase_invoices_table.append("`total_extras_amount` float NOT NULL DEFAULT '0', ");
        create_purchase_invoices_table.append("`total_amount_billed` float NOT NULL, ");
        create_purchase_invoices_table.append("`total_charges_applied` float NOT NULL DEFAULT '0', ");
        create_purchase_invoices_table.append("`total_discounts_applied` float NOT NULL DEFAULT '0', ");
        create_purchase_invoices_table.append("`payment_option` varchar(16) NOT NULL, ");
        create_purchase_invoices_table.append("`invoice_tickets` text NOT NULL, ");
        create_purchase_invoices_table.append("`invoice_customer` text NOT NULL, ");
        create_purchase_invoices_table.append("`invoice_extras` text NULL, ");
        create_purchase_invoices_table.append("`verified_at` timestamp NULL DEFAULT NULL, ");
        create_purchase_invoices_table.append("`cancelled_at` timestamp NULL DEFAULT NULL, ");
        create_purchase_invoices_table.append("`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, ");
        create_purchase_invoices_table.append("`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, ");
        create_purchase_invoices_table.append("PRIMARY KEY (`id`), ");
        create_purchase_invoices_table.append("UNIQUE (`reference_code`));");
        db.execSQL(create_purchase_invoices_table.toString());
        Log.i(LOGTAG,  "Purchase Invoices Table has been created");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,  int oldVersion,  int newVersion) {
        if (newVersion > oldVersion) {
            Log.w("MyAppTag",  "Updating database from version " + oldVersion + " to "
                    + newVersion + " .Existing data will be lost.");
            db.execSQL("DROP TABLE IF EXISTS `" + TABLE_APP_PREFERENCES + "`;");
            db.execSQL("DROP TABLE IF EXISTS `"+TABLE_ORGANISER+"`;");
            db.execSQL("DROP TABLE IF EXISTS `"+TABLE_EVENTS+"`;");
            db.execSQL("DROP TABLE IF EXISTS `" + TABLE_PURCHASE_INVOICES + "`;");
            onCreate(db);
        }

    }
}

This is my LocalDBDataSource.java class:

package com.xxxxxx.eventmanager.db;

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

public class LocalDBDataSource {

    private static final String LOGTAG = "MTGH_DB_LOG";

    SQLiteOpenHelper dbhelper;
    SQLiteDatabase database;

    public LocalDBDataSource(Context context) {
        dbhelper = new LocalDBOpenHelper(context);
    }

    public void open() {
        Log.i(LOGTAG, "Database Connection Opened.");
        database = dbhelper.getWritableDatabase();
    }

    public void close() {
        Log.i(LOGTAG, "Database Connection Closed.");
        dbhelper.close();
    }

}

This is my MainActivity.java class which also uses a fragment:

package com.xxxxxx.eventmanager;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.xxxxxx.eventmanager.services.UpdaterService;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;


public class MainActivity extends AppCompatActivity {

    // Shared Preferences
    private SharedPreferences settings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        MainActivityFragment mainFragment = new MainActivityFragment();

        getSupportFragmentManager().beginTransaction()
                .add(R.id.frame, mainFragment).commit();

        settings = getSharedPreferences("App", MODE_PRIVATE);

        Intent ishintent = new Intent(this, UpdaterService.class);
        PendingIntent pintent = PendingIntent.getService(this, 0, ishintent, 0);
        AlarmManager alarm = (AlarmManager)getSystemService(this.ALARM_SERVICE);
        alarm.cancel(pintent);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),5000, pintent);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        switch (id) {
            case R.id.action_settings:
                Toast.makeText(MainActivity.this, "You selected the settings menu!", Toast.LENGTH_SHORT).show();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

Aucun commentaire:

Enregistrer un commentaire