#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. Спасибо за ваш ответ. 🙂