2016-03-22 10 views
2

Ich bin neu bei StackOverflow, also bin ich mir nicht sicher, wie das funktioniert, aber ich brauche wirklich Hilfe mit dieser App, die ich in Android Studio erstelle. Ich habe eine vorbestückte chemicals.sqlite-Datenbank, die ich in Android Studio durchsuchen möchte. Im Grunde wird die App, die ich entwerfe, einem Benutzer erlauben, nach einer Verbindung nach Namen zu suchen, und es werden Informationen darüber angezeigt. Aus irgendeinem Grund sagt mein Programm, dass es keine der Werte anzeigen kann, die ich im Emulator der App suchen möchte. Es zeigt immer nur das "No Match Found".Vorgefüllte SQLite-Datenbank wird in Android Studio nicht richtig gelesen

Hier ist meine DatabaseHelper Klasse:

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
public class DataBaseHelper extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "chemicals.sqlite"; 
private static final String TABLE_OSHA = "osha"; 
public static final String COLUMN_COMPOUND = "compound"; 
public static final String COLUMN_H = "h"; 
public static final String COLUMN_F = "f"; 
public static final String COLUMN_R = "r"; 
public static final String COLUMN_SN = "sn"; 

public DataBaseHelper(Context context, String name, 
        SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    String CREATE_OSHA_TABLE = "CREATE TABLE " + 
      TABLE_OSHA + "(" 
      + COLUMN_COMPOUND + " TEXT," + COLUMN_H 
      + " TEXT," + COLUMN_F + " TEXT," + COLUMN_R + " TEXT," + COLUMN_SN + " TEXT" + ")"; 
    db.execSQL(CREATE_OSHA_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, 
         int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_OSHA); 
    onCreate(db); 
} 
public Compound findCompound(String compoundname) { 
    String query = "Select * FROM " + TABLE_OSHA + " WHERE " + COLUMN_COMPOUND + "= '" + compoundname + "'"; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(query, null); 
    Compound compound = new Compound(); 
    if (cursor.moveToFirst()) { 
     cursor.moveToFirst(); 
     compound.setH(cursor.getString(0)); 
     compound.setF(cursor.getString(1)); 
     compound.setR(cursor.getString(2)); 
     compound.setSN(cursor.getString(3)); 
     // cursor.moveToNext(); 
     cursor.close(); 
    } else { 
     compound = null; 
    } 
    db.close(); 
    return compound; 
} 
} 

Hier ist meine Verbindungsklasse:

public class Compound { 

private String _compound; 
private String _h; 
private String _f; 
private String _r; 
private String _sn; 

public Compound() { 

} 

    public Compound(String compound, String h, String f, String r, String sn) { 
    this._compound = compound; 
    this._h = h; 
    this._f = f; 
    this._r = r; 
    this._sn = sn; 
} 

public Compound(String h, String f, String r, String sn) { 
    this._h = h; 
    this._f = f; 
    this._r = r; 
    this._sn = sn; 
} 

public void setCompound(String compound) { 
    this._compound = compound; 
} 

public String getCompound() { 
    return this._compound; 
} 

public void setH(String h) { 
    this._h = h; 
} 

public String getH() { 
    return this._h; 
} 

public void setF(String f) { 
    this._f = f; 
} 

public String getF() { 
    return this._f; 
} 
public void setR(String r) { 
    this._r = r; 
} 
public String getR(){ 
    return this._r; 
} 
public void setSN(String sn){ 
    this._sn = sn; 
} 
public String getSN(){ 
    return this._sn; 
} 
} 

Und hier ist meine Hauptklasse:

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class oshaSearch extends AppCompatActivity { 
TextView txtH; 
TextView txtR; 
TextView txtF; 
TextView txtSN; 
EditText txtCompound; 
Button btnSearch; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_osha_search); 
    txtF = (TextView) findViewById(R.id.txtF); 
    txtR = (TextView) findViewById(R.id.txtR); 
    txtH = (TextView) findViewById(R.id.txtH); 
    txtSN = (TextView) findViewById(R.id.txtSN); 
    txtCompound = (EditText) findViewById(R.id.searchCompound); 
    btnSearch = (Button) findViewById(R.id.btnSearch); 
} 
public void lookupCompound (View view) { 
    DataBaseHelper dbHandler = new DataBaseHelper(this, null, null, 1); 

    Compound compound = 
      dbHandler.findCompound(txtCompound.getText().toString()); 

    if (compound != null) { 
     txtH.setText(String.valueOf(compound.getH())); 
     txtF.setText(String.valueOf(compound.getF())); 
     txtR.setText(String.valueOf(compound.getR())); 
     txtSN.setText(String.valueOf(compound.getSN())); 
    } else { 
     txtH.setText("No Match Found"); 
    } 
} 
} 

Jedwedes Hilfe ist stark geschätzt. Bitte hilf mir. Weitere Informationen: Die Datenbank befindet sich im Ordner "Assets". Alle Werte in der Datenbank sind Textfelder. Der Benutzer sucht nach dem Verbundnamen. Die Datenbank hat die Erweiterung .sqlite. Vielen Dank im Voraus.

+0

Sie wissen, dass 'DataBaseHelper' immer eine neue' chemicals.sqlite' auf dem Telefon erstellen wird, und ignorieren Sie alles, was Sie in Ihrem Vermögen haben, richtig? Weil ich nicht sehe, wo Sie Ihre Datenbank auffüllen. –

+1

Willkommen bei Stack Overflow! Vielen Dank, dass Sie sich die Zeit genommen haben, korrekte Grammatik zu verwenden und sicherzustellen, dass Ihr Code richtig formatiert ist. Oftmals scheinen neue Benutzer ihre Manieren zu vergessen, wenn sie posten. –

+0

@david Danke für die Antwort! Ich wusste das nicht ... Ich dachte, ich hätte es so eingerichtet, dass es den .sqlite-Ordner in meinen Assets durchsuchen und Daten daraus ziehen würde. Das war zumindest, was meine Absicht war ... – KatieJRise

Antwort

0

Sie haben Ihre Datenbank zu kopieren, die Sie gesagt ist im Anlagenordner neu erstellte Datenbank -

private void copyDataBase(String dbname) throws IOException { 
     // Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(dbname); 
     // Path to the just created empty db 
     String outFileName = getDatabasePath(dbname); 
     // Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 
     // transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 
     // Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } 
+0

Danke für den Code @Shadab, aber ich bin verwirrt, wie ich in der Lage wäre zu suchen die Datenbank, an die es angehängt ist. Muss ich etwas in meiner findCompound() Methode ändern? – KatieJRise

+0

Nachdem Sie Ihre Assets-Datenbank in Ihre lokale Datenbank kopiert haben, haben Sie Zugriff auf alle Werte. Sie müssen keine anderen Methoden ändern. –

+0

Also habe ich versucht, den Code einzufügen, es gibt mir Fehler, dass ich myContext und getDatabasePath nicht definiert habe. Ich habe Context myContext definiert, aber für getDatabasePath sollte ich den Namen der Datenbank dort eingeben? Entschuldigung, ich bin wirklich noch verloren. – KatieJRise

0

müssen Sie zunächst prüfen, ob Datenbank ordnungsgemäß erstellt wird oder nicht, denn die

public DataBaseHelper(Context context) { 
    super(context, Environment.getExternalStorageDirectory()+"/"+DATABASE_NAME, null, 1); 
} 

Verwenden Sie diesen Konstruktor, dies wird Ihre App-Datenbank im externen Speicher Ihres Telefons speichern. zuvor geben Sie die Berechtigung für externen Speicher in der Manifestdatei. und verwenden Sie sqliteManager-Anwendung von Google Play Store, um die Datenbankstruktur zu überprüfen.

Oder Sie können Stetho verwenden, um Datenbank von Android zu debuggen. Referenzlink: http://code.tutsplus.com/tutorials/debugging-android-apps-with-facebooks-stetho--cms-24205

Verwandte Themen