0

Meine RecyclerView funktionierte gut, wenn ich es aus einer lokalen Datenbank mit SQLiteHelper gefüllt, aber jetzt möchte ich es mit einer externen Datenbank in meinem Assets Ordner mit SQLiteAssetHelper füllen, so folgte ich dem Beispiel von dies Github SQLiteAssetHelper example, aber ich denke, dass die SimpleCursorAdapter() -Methode ist kompatibel mit ListView, aber nicht mit dem RecyclerView, da es mir einen "Inkompatiblen Typ" IDE-Fehler gibt.Füllen Sie eine RecyclerView mit SQLiteAssetHelper

Ist das ein Weg um dies oder sollte ich meine RecyclerView zu einem ListView konvertieren? Hilfe würde sehr geschätzt werden.

public class DisplayActivity extends AppCompatActivity { 

    DataSource mDataSource; 
    List<Facility> facilityList = DataProvider.facilityList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_display); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     mDataSource = new DataSource(this); 
     mDataSource.open();        // Open database 
     mDataSource.seedDatabase(facilityList); 

     List<Facility> listFromDB = mDataSource.getAllItems(); 
     FacilitiesAdapter adapter = new FacilitiesAdapter(this, listFromDB); 
     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.displayActivityRecyclerView); 
     recyclerView.setAdapter(adapter); 

    } // End of onCreate() 


    @Override 
    protected void onPause() { 
     super.onPause(); 
     mDataSource.close();      // Close database connection when application is 
    }            // paused to prevent database leaks. 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mDataSource.open();       // Open database connection when application is resumed 
    } 
} 

SQLiteHelper Klasse:

public class DBHelper extends SQLiteOpenHelper { 

    public static final String DB_FILE_NAME = "health.db"; 
    public static final int DB_VERSION = 1; 

    public DBHelper(Context context) { 
     super(context, DB_FILE_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(FacilitiesTable.SQL_CREATE);   // Execute SQL_CREATE statement; 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(FacilitiesTable.SQL_DELETE);   // delete old database 
     onCreate(db);         // Create new database 
    } 
} 
+1

"Mein RecyclerView funktionierte gut, als ich es aus einer lokalen Datenbank mit SQLiteHelper bevölkerte" - Sie verwendeten dort 'SimpleCursorAdapter' nicht. Also, wenn es "gut funktioniert", bleiben Sie bei diesem Code und tauschen Sie Ihren 'SQLiteOpenHelper' für einen' SQLiteAssetHelper' aus. Andernfalls erstellen Sie Ihren eigenen "RecyclerView.Adapter", der Ihren 'Cursor' als Datenquelle verwendet. – CommonsWare

+0

@CommonsWare Vielen Dank für Ihre Antwort :) Aber ich muss die externe Datenbank verwenden oder irgendwie die Datenbankdatei in meinen/data/data/package/database-Ordner kopieren, was die perfekte Lösung wäre. – aatj

+0

Bitte bearbeiten Sie Ihre Frage und zeigen Sie den Code, der "funktionierte gut mit ich füllte es aus einer lokalen Datenbank mit SQLiteHelper". – CommonsWare

Antwort

2

SQLiteAssetHelper ist ein Plug-and-Play-Ersatz für SQLiteOpenHelper, wie SQLiteAssetHelper selbst erweitert SQLiteOpenHelper.

also Code gegeben, der mit einer Unterklasse von SQLiteOpenHelper arbeitet, alles, was Sie tun müssen, ist:

  • ändern, die SQLiteAssetHelper

  • Fernbedienung, um die onCreate() und onUpgrade() Methoden

  • zu verlängern Unterklasse
  • Passen Sie den Aufruf an den Superklassenkonstruktor an, falls erforderlich

Dann packen Sie Ihre Datenbank in assets/, per the documentation, und Sie sollten gut gehen.

Jeder Code, der beim Erweitern von SQLiteOpenHelper funktioniert hat, sollte jetzt weiter funktionieren, nachdem Sie SQLiteAssetHelper erweitert haben.

-1

Sie die Datenbank von Assets Ordner mit dieser Methode "default" kopieren:

public final String path = "/data/data/YourPackageName/databases/"; 
    public final String Name = "DataBaseName.db"; 

    public void copydatabase() throws IOException { 

     OutputStream myOutput = new FileOutputStream(path + Name); 
     byte[] buffer = new byte[1024]; 
     int length; 
     InputStream myInput = getApplicationContext().getAssets().open("DataBaseName.db"); 
     while ((length = myInput.read(buffer)) > 0) { 
      myOutput.write(buffer, 0, length); 
     } 
     myInput.close(); 
     myOutput.flush(); 
     myOutput.close(); 

    } 

als einfach anrufen:

copydatabase() 

Und Surround mit versuchen /Fang.

Verwandte Themen