2017-05-08 7 views
0

Ich habe eine Datenbank wie folgt erstellt.cursor.moveToFirst() gibt false zurück

public class DataBase extends SQLiteOpenHelper { 
    private static String DB_NAME="MovieData"; 

    private static String TABLE_VARIABLES="data"; 

    private static int DB_VERSION=1; 
    DataBase(Context context) 
    {super(context,DB_NAME,null,DB_VERSION);//null is for cursors//sqlite helper classes constructor is being called 

    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { //Sqlitedatabase class gives us access to database 

     db.execSQL("CREATE TABLE "+TABLE_VARIABLES+"(" 
       +"_id INTEGER PRIMARY KEY AUTOINCREMENT," 
       + "Movie_Name TEXT," 
       + "Image_Link TEXT," 
       +"Release_Date TEXT," 

       + "Prediction TEXT);"); 
     insert_data(db,"Bahubali","https://www.desiretrees.in/wp-content/uploads/2016/12/Baahubali-2-Posters.jpg","2017/06/23","success"); 
     insert_data(db,"3 Idiots","http://s3.india.com/wp-content/uploads/2016/01/3-idiots-sequel-1.jpg","2018/06/11","success"); 
     insert_data(db,"Sagar","http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg","2019/07/17" ,"success"); 

    } 

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

    } 
    private void insert_data(SQLiteDatabase db,String movie_name,String image_link,String release_date, String prediction){ 
     ContentValues 
       movie_data= new ContentValues(); 
     movie_data.put("Movie_Name",movie_name); 
     movie_data.put("Image_Link",image_link); 
     movie_data.put("Release_Date",release_date); 
     movie_data.put("Prediction",prediction); 
     db.insert("data",null,movie_data); 


    } 
} 

Die eingegebenen Daten dienen nur zum Testen.

Ich möchte auf die Datenbank innerhalb eines Fragments zugreifen. Der Code für diesen Teil des Fragments

DataReceiver data= new DataReceiver(getContext()); 
      movie_name=data.getMovie_name(); 
      image_url=data.getImagelink(); 
      release_date=data.getRelease_date(); 
      prediction=data.getPrediction(); 

Datareceiver separierter Klasse ist, die Daten aus der Datenbank für den Empfang. der Code dafür ist.

public class DataReceiver { 

    private Context mContext; 
    private String movie_name,imagelink,release_date,prediction; 
    private String[] arrangedstring; 

    public DataReceiver(Context context) { 
     this.mContext=context; 
    } 

     public String[] getMovie_name(){ 
      SQLiteDatabase db= open(); 
      Cursor cursor = db.query("data", 
        new String[]{"_id", "Movie_Name"}, 
        null, 
        null, null, null, null 
      ); 
      String send[]= arrangeDescending(cursor,1); 
      cursor.close(); 
      return send; 
     } 
     public String[] getImagelink(){ 
      SQLiteDatabase db= open(); 
      Cursor cursor = db.query("data", 
        new String[]{"_id", "Image_Link"}, 
        null, 
        null, null, null, null 
      ); 
      String send[]= arrangeDescending(cursor,1); 

      cursor.close(); 
      return send; 
     } 
     public String[] getRelease_date(){ 

      SQLiteDatabase db= open(); 
      Cursor cursor = db.query("data", 
        new String[]{"_id","Release_Date"}, 
        null, 
        null, null, null, null 
      ); 
      String send[]= arrangeDescending(cursor,1); 

      cursor.close(); 
      return send; 
     } 
     public String[] getPrediction(){ 
      SQLiteDatabase db= open(); 
      Cursor cursor = db.query("data", 
        new String[]{"_id","Prediction"}, 
        null, 
        null, null, null, null 
      ); 

      String send[]= arrangeDescending(cursor,1); 
      cursor.close(); 
      return send; 
     } 

     private SQLiteDatabase open(){ 
      SQLiteOpenHelper DataBase = new DataBase(mContext); 
      SQLiteDatabase db = DataBase.getReadableDatabase(); 
      return db; 
     } 

     private String[] arrangeDescending(Cursor cursor,int column_no){ 
       if(cursor.moveToFirst()){ 
     int count=0; 
        do{ 
         arrangedstring[count]=cursor.getString(column_no); 
         arrangedstring=moveStringRight(arrangedstring); 
         count++; 

         cursor.moveToNext(); 
        }while(cursor.isAfterLast()); 
        arrangedstring=moveStringLeft(arrangedstring); 
       } 
      return arrangedstring; 
     } 

dann gibt die Methode cursor.moveToFirst() false zurück. Ich weiß nicht, wo ich falsch gelaufen bin.

Antwort

1

Wenn cursor.moveToFirst() false zurückgibt, weil Sie keine Ergebnisse erhalten.

Sie haben einen Fehler bei Ihrer Einfügemethode, und ich glaube, dass Ihre Tabelle leer ist.

Ihre Tabelle hat eine Spalte mit dem Namen „RELEASE_DATE“ aber in Ihrer insert_data Methode Sie verwenden einen falschen Namen:

movie_data.put("Release Date",release_date); 

Sie sind ein „_“

movie_data.put("Release_Date",release_date); 

fehlen dies wahrscheinlich machen Ihre Insert-Abfragen schlagen fehl und deshalb erhalten Sie keine Ergebnisse.

EDIT: Obwohl ich nicht weiß, was Sie mit Ihren Abfragen erreichen möchten, hat die .query() -Methode einen Parameter für die Bestellung ASC oder DESC Ihre Ergebnisse. So könnten Sie Ihre Anordnungsmethode entfernen.

Beispiel für einen Ihrer Abfragen mit ascendent um durch Spalte "MOVIE_NAME":

Cursor cursor = db.query("data", 
        new String[]{"_id", "Movie_Name"}, 
        null, 
        null, null, "Movie_Name ASC", null 
      ); 

die doc Check: https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

+0

Auch Sie Probleme mit arrangeDescending Methode haben, überprüfen Sie, dass Ihr Cursor wird immer habe 2 Spalten {_id, x} und wenn Sie versuchen, cursor.getString (2) aufzurufen; wird fehlschlagen – miibpa

+0

Danke, dass Sie das bemerkt haben.Fixieren der "_" auch nicht geholfen. immer noch falsch fälschend –

+2

Beachten Sie, dass Ihre onCreate-Methode in SqliteOpenHelper nur einmal aufgerufen wird. Daher werden Ihre insert_data nicht erneut aufgerufen. Versuchen Sie, Ihre App erneut zu deinstallieren/zu starten, oder verwenden Sie die OnUpdate-Methode. – miibpa