Ошибка Android Studio- ClassCastException?

#java #android #android-studio #android-sqlite #serializable

#java #Android #android-studio #android-sqlite #сериализуемый

Вопрос:

Я хотел бы быстро упомянуть, что это домашнее задание, но я только ищу направление. Мой профессор раньше не применял SQLite, поэтому он не уверен, что делать. Класс выполняет SharedPreference (который я не смог получить), но это был еще один вариант для хранения данных для списка дел.

Теперь, когда я нажимаю кнопку, чтобы «Добавить» задачу в классе AddDo, она выдает следующие ошибки:

               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
  

РЕДАКТИРОВАТЬ: Вот класс для фактической кнопки. Именно здесь будет находиться мой основной список задач, поскольку XML готов для приема данных и имеет кнопку для добавления новой задачи.

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

        }
    });
  

Это мой класс, предназначенный для добавления задачи (это на ранних стадиях):

     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 = "";

}
  

Это мой 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 amp;amp; !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();
        }


    }
}
  

Мне было интересно, связано ли это с тем фактом, что AddDo реализует serializable? Я мог бы заменить это на другой XML со стандартным действием, и это сработало бы.

Любое направление здесь было бы оценено. Мы с моим профессором понятия не имеем, почему это не хочет работать, и ни один из нас до сих пор не использовал SQLite.

Большое вам спасибо!

Комментарии:

1. опубликовать файл манифеста. Кажется, вы пытались установить класс, который не расширяет activity в вашем файле манифеста.

2. @MJV это свойство styles , с DarkActionBar которым вы увидите панель, а с NoActionBar ее не bar будет, попробуйте res=> значения =>styles.xml

Ответ №1:

AddDo не расширяет класс Activity

Используйте приведенный ниже код для расширения с помощью Activity или Appcompactivity

 public class AddDo extends Activity implements Serializable {
  

Комментарии:

1. Спасибо вам обоим, @siddhesh и Pavneet Singh, за объяснение, что мне нужно расширить Activity!

2. при Activity он отображает пустой белый экран. Когда я расширяю AppCompatActivity, он выдает мне строку заголовка (но ничего больше). Я что-то упускаю из виду? Спасибо!

Ответ №2:

Описание ошибки :

 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 
  

имеется в виду

 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 это простой класс, поэтому вам нужно расширять Activity или AppCompactActivity

 class Addo  extends AppCompactActivity
  

и не забудьте зарегистрировать это в своем manifest.xml

кроме того, почему вы используете Serializable, вам следует создать отдельный класс, чтобы использовать его в качестве модели для вашего приложения, например

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

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

  .. fields and getter and setters
}
  

Комментарии:

1. Спасибо за ваш ответ!! Чтобы конкретно ответить на ваш вопрос, я следую руководству по внедрению SQLite в мое приложение ToDo, но мне нужно, чтобы информация, полученная с помощью XML, передавалась через класс serializable. Спасибо за ваш ответ. 🙂