2017-07-21 2 views
0

ich ein SQLiteOpenHelper Objekt in MainActivity erstellt haben:Zugang zu SQLiteOpenHelper erstellt in 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); 
    }} 

My CurrencyDBHelper Klassencode:

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) { 

} 

Ich brauche die db aus der anderen Klasse zu nennen. Wie kann ich das von der anderen Klasse machen?

Ich versuchte SQLiteOpenHelper nicht in MainActivity zu erstellen, aber es funktioniert nicht für mich. Es scheint so, als müsste ich Context verwenden, aber ich kann es nicht verstehen, dass es so ist.

Bitte helfen. Danke!

+0

PLZ bezogen auf Ihre CurrencyDBHelper Klasse – MatPag

+0

@MatPag Ich habe Frage bearbeitet (hinzugefügt CurrencyDBHe lper Klassencode) –

+0

Was ist der Fehler, den Sie bekommen? – MatPag

Antwort

2

1) Bewegen Sie die DBHelper Klasse eine Klasse in seinem eigenen Recht, dh CurrencyDBHelper.java sein sollte sein: -

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) In der Aktivität in dem Sie die Datenbanknutzung verwendet werden sollen: -

db = new CurrencyDBHelper(this); 

Hinweis! Dies wird NICHT die Datenbank erstellen. Die Datenbank wird nur erstellt, wenn ein Versuch unternommen wird, sie z. die getWRiteableDatabase oder die getReadableDatabase heißt.

so 3)

SQLiteDatabase mydb = db.getWritableDatabase(); 

führt in die Datenbank (das heißt die onCreate Methode des DBHelper erstellt werden wird) aufgerufen werden.

Hinweis! onCreate wird nur einmal für die Lebensdauer der Datenbankdatei aufgerufen. Wenn Sie also die Struktur der Datenbank ändern möchten, ist es wahrscheinlich am einfachsten, die App Data zu löschen oder die App zu deinstallieren und dann erneut zu installieren.

Zu diesem Zeitpunkt werden keine Daten in der Tabelle angezeigt.

Sie konnte jedoch die leere Tabelle zB Abfrage: -

 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(); 

Die Verwendung von Aktivität könnte dann sein: -

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(); 
    } 

Die Ausgabe in das Protokoll nach dem Vorbild der sein würde: -

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

Vielen Dank für Ihre Antwort! Es ist ein großartiges Tutorial für die Arbeit mit QSLite in Android. –