Android mettre en contexte dans la base de données
J'ai une base de données et j'ai créé un Database
classe qui a un private static class DbHelper extends SQLiteOpenHelper
pour m'aider à gérer ma base de données.
Cette base de données est l'accès à partir de quatre activités différentes.
J'ai cette public void onCreate(SQLiteDatabase db)
que c'est ce qui crée ma base de données les tables et ajoute les valeurs de ces tableaux. Depuis que le programme ne saisissez ici la première fois que l'utilisateur exécute l'application, je veux créer un ProgressDialog
.
C'est ce que j'ai:
Override
public void onCreate(SQLiteDatabase db) {
ProgressDialog progresso = ProgressDialog.show(context, "Info", "Loading DB" );
//Code to create the tables and add the values
progress.dismiss();
}
Ai 2 questions.
Première:
Puisque cela peut être accessible à partir de 4 activités différentes, comment puis-je obtenir le contexte?
Décision:
Context context = getAplicationContext();
Deuxième:
Pourquoi ne puis-je pas utiliser de chaînes de strings.xml?
Je ne peux pas faire ceci:
ProgressDialog progresso = ProgressDialog.show(context, getString(R.string.driProgressTitle), getString(R.string.driProgressMessage) );
Mise à JOUR
public class Database {
ProgressDialog progresso;
private DbHelper DBHelper;
private final Context Context;
private SQLiteDatabase BaseDados;
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, BD_NAME, null, BD_VERSION);
//TODO Auto-generated method stub
}
@Override
public void onCreate(SQLiteDatabase db) {
//Whanted to show here the progress dialog
new loadDB().execute();
//Creates the table and adds the values
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVesion) {
db.execSQL("DROP TABLE IF EXISTS MYTABLE");
onCreate(db);
}
}
public Database(Context c) {
Context = c;
}
public Database open() throws SQLException {
DBHelper = new DbHelper(Context);
BaseDados = DBHelper.getWritableDatabase();
return this;
}
public void close() {
DBHelper.close();
}
public Cursor getData(int tipo, long groupId, String query[]) {
//Performs the querys to my database
}
return null;
}
public class loadDB extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... params) {
progresso = ProgressDialog.show(Context, Context.getString(R.string.ProgressTitle), Context.getString(R.string.ProgressMessage) );
return 1;
}
@Override
protected void onPostExecute(Integer result) {
progresso.dismiss();
super.onPostExecute(result);
}
}
}
Avec le code ci-dessus, j'obtiens cette erreur No enclosing instance of type Database is accessible. Must qualify the allocation with an enclosing instance of type Database (e.g. x.new A() where x is an instance of Database).
dans new loadDB().execute();
.
- Non, vous ne pouvez pas toucher quoi que ce soit liés à l'interface graphique à l'intérieur de
doInBackground()
méthode. RemplaceronPreExecute()
et il y a appelProgressDialog.show()
. - Ok. Fait. Mais où dois-je appeler
new loadDB().execute();
? - n'importe où à l'extérieur de
loadDB
, essentiellement dansonStart()
de votre activité. - faire de nouvelles loadDB().execute(); dans le
onCreate(SQLiteDatabase db)
de monDatabase class it gives this error:
Pas enfermer instance de type Base de données est accessible. Doivent être admissibles à l'allocation avec un enfermant instance de type Base de données (par exemple x.new A() où x est une instance de Base de données).` Fairenew loadDB().execute();
dans leonCreate(Bundle savedInstanceState)
de ma classe principale/activité, il donne l'erreur:loadDB cannot be resolved to a type
. Merci pour votre aide
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas accès au Contexte de l'constructeur?
EDIT:
Votre code:
Vous avez accès à la contexte à ce point.. pouvez-vous faire quelque chose comme ajouter un champ appelé contexte alors faire ceci:
Maintenant, vous avez accès à le contexte de n'importe où dans la classe? En supposant que le constructeur est appelé avant onCreate.
new loadDB().execute();
. fairenew loadDB().execute();
dans leonCreate(SQLiteDatabase db)
de monDatabase
classe, il donne cette erreur:No enclosing instance of type Database is accessible. Must qualify the allocation with an enclosing instance of type Database (e.g. x.new A() where x is an instance of Database).
Fairenew loadDB().execute();
dans leonCreate(Bundle savedInstanceState)
de ma classe principale/activité, il donne l'erreur:loadDB cannot be resolved to a type
.ProgressDialog
Collé ici le code si vous avez le temps pastebin.com/M5pJc6fyLa
onCreate(SQLiteDatabase)
méthode est appelée la première fois que vous effectuez un appel àgetReadableDatabase()
ougetWritableDatabase
(c'est à dire la première fois qu'il est ouvert), et non pas lors de l'application de la première exécution (bien sûr, vous pourriez d'abord que cela arrive, par simple ouverture de la base de données de la fermeture).Je ne suis pas sûr de donner le contexte de l'Application va travailler depuis la progressDialog devra être affiché dans les actuellement en cours d'exécution de l'Activité.
Au lieu de l'affichage des barres de progression pour précisément lorsque la base de données est d'abord accessible, votre Activité en cours d'affichage une fois qu'il accède à la base de données elle-même. De cette façon, le premier accès à la base de données est masqué par un accès régulier à elle.
Si vous ne souhaitez pas afficher les barres de progression pour tous les DB d'accès, puis de nouveau vous suffit de l'ouvrir et de fermer la base de données et avoir une Activité de votre écran une barre de progression avant de l'ouvrir, et de supprimer la barre de progression lorsque vous fermez (ne pas faire n'importe quoi avec la base de données à l'exception de laisser
onCreate()
run).À moins que votre base de données de structures sont vraiment de gros, vous ne sera probablement même pas voir la barre de progression. Il ne faut pas très longtemps pour créer les tables.
Utilisation du Chargeur pour la lecture de données à partir de DB. Ne pas encombrer les classes de fond avec des éléments d'INTERFACE utilisateur
Aussi permet de lire des données à partir de thread d'arrière-plan qui est recommandé.
Vous êtes incapable d'accéder au contexte de l'application, comme SQLiteOpenHelper ne pas contenir de ces méthodes (à la différence de l'Activité)
Mon conseil pour vous est d'utiliser la DbHelper classe pour configurer la base de données et la gestion des transactions sql. Avez constructeur de prendre un objet de contexte, puis de créer des instances de celui-ci au sein d'une classe qui s'étend de l'Activité, en passant le contexte par le constructeur.
Il serait également une bonne pratique d'avoir un accès aux données de l'objet de classe assis entre l'activité et la sqlliteOpenHelper, pour gérer l'ouverture, la fermeture et l'émission de transactions de la base de données de l'objet
Database db= new Database(this); new loadDB().execute(); db.open();
dans l'activité que les appels à la base de données?Pour afficher le nom d'utilisateur, vous devrez exécuter votre travail dans un thread séparé, sinon GUI congelez-les jusqu'à ce que la base de données de travail est terminée et que l'utilisateur peut obtenir les "l'Activité ne répond pas, la force de fermeture" message.
Utilisation
Application
classe pour stocker un indicateur global sur si la base de données a été créé ou non.Les vérifications de l'activité de ce drapeau, si la base de données n'a pas été initialisé, il crée un
AsyncTask
, passe sur db et son contexte propre au constructeur.AsyncTask
aura trois méthodes: