2017-07-21 2 views
0

J'ai créé un objet SQLiteOpenHelper dans MainActivity:accès à SQLiteOpenHelper créé en MainActivity

public class ExchangeActivity extends AppCompatActivity { 


public CurrencyDBHelper db; 
private Handler handler; 
private int delay = 30000; 
private DataHandler dataHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //create CurrencyDBHelper object 
    db = new CurrencyDBHelper(this); 
    Log.v("DBTag", "DB created"); 


    //Activity and UI 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_exchange); 
    }} 

Mon CurrencyDBHelper code de classe:

public class CurrencyDBHelper extends SQLiteOpenHelper { 

public static final int DATABASE_VERSION = 1; 
public static final String DATABASE_NAME = "LastCurrency.db"; 

//constructor 
public CurrencyDBHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE CURRENCY (" 
      + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + "NAME TEXT, " 
      + "RATE REAL); "); 
} 

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

} 

Je dois appeler la db de l'autre classe. Comment puis-je faire cela de l'autre classe?

J'ai essayé de créer SQLiteOpenHelper pas dans MainActivity, mais cela ne fonctionne pas pour moi. Il semble que je doive utiliser Context, mais je ne le fais pas pour le faire.

Aidez-nous s'il vous plaît. Merci!

+0

code postal associé à votre classe CurrencyDBHelper – MatPag

+0

@MatPag J'ai édité la question (ajouté CurrencyDBHe lper class code) –

+0

Quelle est l'erreur que vous obtenez? – MatPag

Répondre

2

1) Déplacer la classe DBHelper être une classe dans son propre droit à savoir CurrencyDBHelper.java devrait être: -

public class CurrencyDBHelper extends SQLiteOpenHelper { 

    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "LastCurrency.db"; 

    //constructor 
    public CurrencyDBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE CURRENCY (" 
       + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + "NAME TEXT, " 
       + "RATE REAL); "); 
    } 

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

    } 
} 

2) Dans l'activité dans laquelle vous souhaitez utiliser l'utilisation de base de données: -

db = new CurrencyDBHelper(this); 

Remarque! Cela ne créera pas la base de données. La base de données ne sera créée que lorsque la tentative d'ouverture de celle-ci aura lieu, par exemple, . le getWRiteableDatabase ou le getReadableDatabase est appelé.

si 3)

SQLiteDatabase mydb = db.getWritableDatabase(); 

se traduira par la base de données en cours de création (à savoir la méthode de la onCreate DBHelper sera appelé).

Remarque! OnCreate ne sera appelé qu'une fois pour la durée de vie du fichier de base de données . Par conséquent, si vous souhaitez modifier la structure de la base de données , il est probablement plus facile de supprimer les données d'application lors de l'élaboration de l'application ou de la désinstaller, puis de réinstaller l'application.

À ce stade, il n'y aura pas de données dans le tableau.

Vous pouvez cependant interroger la table vide, par exemple: -

 Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null); 
     Log.v("MYDB","Table CURRENCY has " + 
       Integer.toString(csr.getCount()) + 
       " rows" 
     ); 
     for (int i=0; i < csr.getColumnCount(); i++) { 
      Log.v("MYDB","Table CURRENCY has a column named " + 
        csr.getColumnName(i) 
      ); 
     } 
     csr.close(); 

L'activité à l'aide pourrait alors être: -

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     db = new CurrencyDBHelper(this); 
     SQLiteDatabase mydb = db.getWritableDatabase(); 
     Cursor csr = mydb.query("CURRENCY",null,null,null,null,null,null,null); 
     Log.v("MYDB","Table CURRENCY has " + 
       Integer.toString(csr.getCount()) + 
       " rows" 
     ); 
     for (int i=0; i < csr.getColumnCount(); i++) { 
      Log.v("MYDB","Table CURRENCY has a column named " + 
        csr.getColumnName(i) 
      ); 
     } 
     csr.close(); 
    } 

La sortie dans le journal serait le long des lignes de: -

07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has 0 rows 
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named _id 
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named NAME 
07-21 17:38:07.290 1886-1886/mjt.cardoniser V/MYDB: Table CURRENCY has a column named RATE 
+0

Merci pour votre réponse! C'est un excellent tutoriel pour travailler avec QSLite dans Android. –