Listviews en prepopulated databases in android

Status
Niet open voor verdere reacties.

ArcHDragoN

Nieuwe gebruiker
Lid geworden
7 sep 2014
Berichten
1
Hallo,

Ik ben sinds kort bezig met programmeren in Android voor een project. Nu ben ik even testprojectjes aan het doen om verschillende dingen uit te proberen.
Ik heb een tutorial gevonden voor het gebruik van prepopulated databases en hoe ik de data daarvan in de listview kan zetten. Dit werkt prima, echter zodra ik de database update veranderd er niets in de listview, het blijft dezelfde data gebruiken dat de oude database had.

Code:
package com.gdenhaan.listview;

import java.util.ArrayList;



import android.support.v7.app.ActionBarActivity;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
	
	private static final String DB_NAME = "test.db";
	private static final String TABLE_NAME = "TestTable";
	
	public static final String TEST_ID = "_id";
	public static final String TEST_NAME = "Name";
	public static final String[] ALL_KEYS = new String[]
			{
				TEST_ID, TEST_NAME
			};
	
	private SQLiteDatabase database;
	//private ListView ListView;
	//private ArrayList<String> NameList;
	//private TestHelper testDB;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fragment_main);
		Button Next = (Button) findViewById(R.id.btnNext);

		TestHelper testDB = new TestHelper(this, DB_NAME);
		database = testDB.openDataBase();
		populateListForm();
		
		Next.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				startActivity(new Intent(MainActivity.this, Second.class));
				
			}
		});
	}
	
	public Cursor getAllRows()
	{
		String where = null;
		String orderBy = "Name";
		
		Cursor c = database.query(true, TABLE_NAME, ALL_KEYS, where, null, null, null, null, null);
		c.moveToFirst();
		return c;
	}
	
	private void populateListForm()
	{
		Cursor cursor = getAllRows();
		
		//startManagingCursor(cursor);
		
		String[] Names = new String[] {TEST_NAME};
		int[] toViewFields = new int[]{R.id.textView1};
		SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(this, R.layout.list, cursor, Names, toViewFields,1);
		myCursorAdapter.changeCursor(cursor);
		myCursorAdapter.notifyDataSetChanged();
		Log.d("in the getAllRows", myCursorAdapter.toString());	
		ListView myList = (ListView)findViewById(R.id.listView1);
		myList.setAdapter(myCursorAdapter);
		ListView mySecondList = (ListView)findViewById(R.id.listView2);
		mySecondList.setAdapter(myCursorAdapter);
	}
	
	@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, 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();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}

en dit is de testhelper class

Code:
package com.gdenhaan.listview;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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

public class TestHelper extends SQLiteOpenHelper {

	public static String DB_PATH;
	public static String DB_NAME;
	public SQLiteDatabase database;
	public final Context context;
	
	public SQLiteDatabase getDB()
	{
		return database;
	}
	
	public TestHelper(Context context, String databaseName)
	{
		super(context, databaseName, null, 1);
		this.context = context;
		
		String PackageName = context.getPackageName();
		DB_PATH = String.format("//data//data//%s//databases//", PackageName);
		DB_NAME = databaseName;
		openDataBase();
	}
	
	public void createDataBase()
	{
		boolean dbExist = checkDataBase();
		if(!dbExist)
		{
			this.getReadableDatabase();
			try
			{
				copyDataBase();
			}
			catch(IOException e)
			{
				Log.e(this.getClass().toString(), "Copying Error");
				throw new  Error("Error Copying Database!");
			}
		}
		else
		{
			Log.i(this.getClass().toString(), "Database Already Exists");
		}
	}
	
	private boolean checkDataBase()
	{
		SQLiteDatabase checkDB = null;
		try
		{
			String path = DB_PATH + DB_NAME;
			checkDB = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
		}
		catch(SQLException e)
		{
			Log.e(this.getClass().toString(), "Error while checking db");
		}
		if(checkDB != null)
		{
			checkDB.close();
		}
		return checkDB != null;
	}
	
	private void copyDataBase() throws IOException
	{
		InputStream externalDBStream = context.getAssets().open(DB_NAME);
		String outFileName = DB_PATH + DB_NAME;
		OutputStream localDBStream = new FileOutputStream(outFileName);
		
		byte[] buffer = new byte[1024];
		int bytesRead;
		while ((bytesRead = externalDBStream.read(buffer)) > 0)
		{
			localDBStream.write(buffer,0, bytesRead);
		}
		localDBStream.close();
		externalDBStream.close();
	}
	
	public SQLiteDatabase openDataBase() throws SQLException
	{
		String path = DB_PATH + DB_NAME;
		if(database == null)
		{
			createDataBase();
			database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
		}
		return database;
	}
	
	@Override
	public synchronized void close()
	{
		if(database != null)
		{
			database.close();
		}
		super.close();
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) 
	{
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
	{
	}

}

De database zelf is gemaakt met SQLite Database Browser en het project wordt gemaakt in Eclipse.

Hopelijk hebben jullie een antwoord hiervoor of misschien een manier hoe ik dit beter kan doen.

Mvg,

ArcHDragoN
 
Als je de database bij werkt moet je weer opnieuw de data ophalen voor je listview of je moet je listview zelf bijwerken met wat je toegevoegd hebt als je dataverkeer wilt beperken.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan