2016-10-21 1 views
0


Je voudrais mentionner rapidement que c'est un travail à faire, mais je cherche seulement une direction. Mon professeur n'a pas encore appliqué SQLite, donc il ne sait pas quoi faire. La classe fait SharedPreference (ce que je n'ai pas pu obtenir), mais c'était une autre option à utiliser pour stocker des données pour une liste de choses à faire.Android Studio - Erreur ClassCastException?

Maintenant, quand je vais frapper un bouton « Ajouter » une tâche dans la classe AddDo, il jette l'erreur suivante (s):

   java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{net.example.name.dotoday/net.name.example.dotoday.AddDo}: java.lang.ClassCastException: net.example.name.dotoday.AddDo cannot be cast to android.app.Activity 

EDIT: Voici la classe pour la bouton actuel. C'est ici que résidera ma liste de tâches principale, car le XML est prêt pour les données et dispose d'un bouton pour ajouter une nouvelle tâche.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    Button addMainTask = (Button) findViewById(R.id.addMainTask); 

    addMainTask.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      //This is being flagged as of now because the class type IS not Activity, but serializable. 
      startActivity(new Intent(main.this, AddDo.class)); 

     } 
    }); 

C'est ma classe signifiait pour ajouter une tâche (ce qui est dans les premiers stades):

package net.example.name.dotoday; 

import java.io.Serializable; 

public class AddDo implements Serializable { 

    //This is what will be transferred to the actual DB when I make a task. 
    public String doParentID, doTaskTitle, doStatus, doDueDate, doCompletedTask, doCalculatedProgress = ""; 

} 

Ceci est mon DBHandler:

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

import net.example.name.dotoday.AddDo; 

import java.util.ArrayList; 
import java.util.List; 

public class DBHelper extends SQLiteOpenHelper { 

    private static final String TAG = "DbHelper"; 

    // Database Info 
    private static final String TheDB = "TheDB"; 
    private static final int DATABASE_VERSION = 1; 

    //DB Table Names 
    private static final String TABLE_ParentTask = "ParentTask"; 
    private static final String TABLE_SubTask = "SubTask"; 


    //ParentTask Table Columns 
    private static final String parentIDColumn = "_parentID"; 
    private static final String taskTitleColumn = "_taskTitle"; 
    private static final String statusColumn = "_status"; 
    private static final String dueDateColumn = "_dueDate"; 
    private static final String completedColumn = "_completedTask"; //When completion is 100% 
    private static final String calculatedProgressColumn = "_calculatedProgress"; //LONG VALUE WHEN CONVERTED. 

    //SubTask Table Columns 
    private static final String foreignkeyColumn = "_foreignkey"; 
    private static final String childIDColumn = "_childID"; 
    private static final String subTaskDescColumn = "_subTaskDesc"; 
    private static final String subCompletedColumn = "_subCompleted"; // BOOL for individual tasks -- may not be implemented 


    /* -- Here comes the real fun, ya'll! -- */ 

    private static DBHelper mDbHelper; 


    public static synchronized DBHelper getInstance(Context context) { 
     // Use the application context, which will ensure that you 
     // don't accidentally leak an Activity's context. 

     if (mDbHelper == null) { 
      mDbHelper = new DBHelper(context.getApplicationContext()); 
     } 
     return mDbHelper; 
    } 


    /** 
    * Constructor should be private to prevent direct instantiation. 
    * Make a call to the static method "getInstance()" instead. 
    */ 
    private DBHelper(Context context) { 
     super(context, TheDB, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_ParentTask_TABLE = "CREATE TABLE " + TABLE_ParentTask + 
       "(" + 
       parentIDColumn + " INTEGER PRIMARY KEY ," + 
       taskTitleColumn + " TEXT," + 
       statusColumn + " BOOL," + 
       dueDateColumn+ " TEXT," + 
       completedColumn + " BOOL," + 
       calculatedProgressColumn + " REAL" + 
       ")"; 

     //CREATE THE PHYSICAL TABLE 
     db.execSQL(CREATE_ParentTask_TABLE); 

     /*String CREATE_SubTask_TABLE = "CREATE TABLE " + TABLE_SubTask + 
       "(" + 
       childID + " INTEGER PRIMARY KEY ," + 
       foreignkey + " INT," + 
       subTaskDesc + " TEXT," + 
       subCompleted + " BOOL" + 
       ")"; 

     //CREATE THE PHYSICAL TABLE 
     db.execSQL(CREATE_SubTask_TABLE);*/ 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion != newVersion) { 
      // Simplest implementation is to drop all old tables and recreate them 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_ParentTask); 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_SubTask); 

      onCreate(db); 
     } 
    } 

    public void insertTaskDetails(AddDo userData) { 

     SQLiteDatabase db = getWritableDatabase(); 

     db.beginTransaction(); 

     try { 
      ContentValues values = new ContentValues(); 
      values.put(parentIDColumn, userData.doParentID); 
      values.put(taskTitleColumn, userData.doTaskTitle); 
      values.put(statusColumn, userData.doStatus); 
      values.put(dueDateColumn, userData.doDueDate); 
      values.put(completedColumn, userData.doCompletedTask); 
      values.put(calculatedProgressColumn, userData.doCalculatedProgress); 

      db.insertOrThrow(TABLE_ParentTask, null, values); 
      db.setTransactionSuccessful(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
      Log.d(TAG, "Error while trying to add post to database"); 
     } finally { 

      db.endTransaction(); 
     } 


    } 

    /* 
    fetch all data from UserTable 
    */ 

    public List<AddDo> getAllMainTasks() { 

     List<AddDo> usersdetail = new ArrayList<>(); 

     String USER_DETAIL_SELECT_QUERY = "SELECT * FROM " + TABLE_ParentTask; 

     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery(USER_DETAIL_SELECT_QUERY, null); 

     try { 
      if (cursor.moveToFirst()) { 
       do { 
        AddDo userData = new AddDo(); 
        userData.doParentID = cursor.getString(cursor.getColumnIndex(parentIDColumn)); 
        userData.doTaskTitle = cursor.getString(cursor.getColumnIndex(taskTitleColumn)); 
        userData.doStatus = cursor.getString(cursor.getColumnIndex(statusColumn)); 
        userData.doDueDate = cursor.getString(cursor.getColumnIndex(dueDateColumn)); 
        userData.doCompletedTask = cursor.getString(cursor.getColumnIndex(completedColumn)); 
        userData.doCalculatedProgress = cursor.getString(cursor.getColumnIndex(calculatedProgressColumn)); 

        usersdetail.add(userData); 

       } while (cursor.moveToNext()); 
      } 
     } catch (Exception e) { 
      Log.d(TAG, "Error while trying to get posts from database"); 
     } finally { 
      if (cursor != null && !cursor.isClosed()) { 
       cursor.close(); 
      } 
     } 

     return usersdetail; 

    } 

    /* 
    Delete single row from ParentTask 
    */ 
    void deleteRow(String name) { 
     SQLiteDatabase db = getWritableDatabase(); 


     try { 
      db.beginTransaction(); 
      db.execSQL("delete from " + TABLE_ParentTask + " where parentid ='" + parentIDColumn + "'"); 
      db.setTransactionSuccessful(); 
     } catch (SQLException e) { 
      Log.d(TAG, "Error while trying to delete task detail"); 
     } finally { 
      db.endTransaction(); 
     } 


    } 
} 

Je me demandais si cela devait faire avec le fait AddDo implémente sérialisable? Je pourrais l'échanger à un XML différent avec une activité standard, et cela fonctionnerait.

Toute direction ici serait appréciée. Mon professeur et moi ne savons pas pourquoi cela ne veut pas se comporter, et aucun de nous n'a utilisé SQLite jusqu'à présent.

Merci beaucoup!

+0

fichier post manifeste. Vous semblez avoir essayé de définir une classe qui ne prolonge pas l'activité dans votre fichier manifeste. – Paulo

+0

@MJV c'est la propriété de 'styles', avec' DarkActionBar' vous verrez une barre et avec 'NoActionBar' il n'y aura pas de' bar', essayez res => values ​​=> styles.xml –

Répondre

1

AddDo ne prolonge pas classe d'activité

utilisation ci-dessous le code en utilisant l'activité ou étendent AppCompactActivity

public class AddDo extends Activity implements Serializable { 
+0

Merci à tous les deux, @siddhesh et Pavneet Singh, pour avoir expliqué que j'avais besoin d'étendre l'activité! – MJM

+0

avec Activité, il dessine un écran blanc vide. Quand j'applique AppCompatActivity, cela me donne la barre de titre (mais rien d'autre). Est-ce que je regarde quelque chose? Je vous remercie! – MJM

1

Erreur descrption:

Unable to instantiate activity 
ComponentInfo{net.example.name.dotoday/net.name.example.dotoday.AddDo}: 
java.lang.ClassCastException: net.example.name.dotoday.AddDo cannot be cast to android.app.Activity 

signifie

Android is unable to create an object of Activity , 
the reason is related with AddDo class 
android can't convert AddDo class to Activity because AddDo is not a child of 
Activity but android need an activity parent-child relationship 
between AddDo and Activity 

Addo est une classe simple, donc vous devez étend Activity ou AppCompactActivity

class Addo extends AppCompactActivity 

et ne pas oublier de l'enregistrer dans votre manifest.xml

ainsi que la raison pour laquelle vous utilisez Serializable, vous devez créer une catégorie distincte pour l'utiliser comme modèle pour votre application comme

class Data implements Serializable 
{ 
public String doParentID, doTaskTitle, doStatus, doDueDate, doCompletedTask, doCalculatedProgress = ""; 

    public Data(){} // suitable default and parameterized constructor 

    .. fields and getter and setters 
} 
+0

Merci pour votre réponse !! Pour répondre spécifiquement à votre question, je suis un tutoriel pour l'implémentation de SQLite dans mon application ToDo, mais j'ai besoin que les informations obtenues via le XML soient transférées via la classe sérialisable. Merci pour votre réponse.:) – MJM