Приложение на android работает с базой данных sqlite Мне нужно реализовать возможность добавления/удаления материал. Что сделано на данный момент. game_view(отвечает за вывод информации из бд)
package com.example.glavnaya;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.glavnaya.utils.DatabaseHelper;
import com.example.glavnaya.utils.FavoriteHelper;
import com.example.glavnaya.utils.ItemStory;
public class game_view extends AppCompatActivity {
TextView txtName, txtDate, txtView;
WebView webView;
Toolbar toolbar;
ScrollView mScrollView;
ProgressBar mProgressBar;
ItemStory objBean;
String Id;
LinearLayout mAdViewLayout;
Menu menu;
DatabaseHelper DatabaseHelper;
FavoriteHelper FavoriteHelper;
boolean isFromNotification = false;
ImageView ImgStory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_view);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
toolbar.setTitle("Просмотр материала");
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();// возврат на предыдущий activity
}
});
String title=getIntent().getStringExtra("title");
String text=getIntent().getStringExtra("text");
TextView wordText= (TextView) findViewById(R.id.wordtext);
TextView definitionText= (TextView) findViewById(R.id.definitiontext);
wordText.setText(title);
definitionText.setText(text);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
onBackPressed();
break;
case R.id.favorite:
ContentValues fav = new ContentValues();
if (FavoriteHelper.getFavouriteById(Id)) {
FavoriteHelper.removeFavouriteById(Id);
menu.getItem(0).setIcon(R.drawable.favorite);
Toast.makeText(game_view.this, getString(R.string.favourite_remove), Toast.LENGTH_SHORT).show();
} else {
fav.put(FavoriteHelper.KEY_ID, Id);
fav.put(FavoriteHelper.KEY_TITLE, objBean.getStoryTitle());
fav.put(FavoriteHelper.KEY_TEXT,objBean.getStoryText());
fav.put(FavoriteHelper.KEY_FAVORITE,objBean.getStoryFavorite());
FavoriteHelper.addFavourite(FavoriteHelper.TABLE_FAVOURITE_NAME, fav, null);
menu.getItem(0).setIcon(R.drawable.favorite_i);
Toast.makeText(game_view.this, getString(R.string.favourite_add), Toast.LENGTH_SHORT).show();
}
break;
}
return true;
}
private void isFavourite() {
if (FavoriteHelper.getFavouriteById(Id)) {
menu.getItem(0).setIcon(R.drawable.favorite);
} else {
menu.getItem(0).setIcon(R.drawable.favorite_i);
}
}
@Override
public void onBackPressed() {
if (isFromNotification) {
Intent intent = new Intent(game_view.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
} else {
super.onBackPressed();
}
}
}
Отвечает за базу данных favorite.sqlite и хранению закладок, чтобы при обновлении основной базы данных она не вылетала.
package com.example.glavnaya.utils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
public class FavoriteHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "favorite.sqlite";
public static final String TABLE_FAVOURITE_NAME = "danetki";
public static final String KEY_ID = "id";
public static final String KEY_TITLE = "title";
public static final String KEY_TEXT = "text";
public static final String KEY_FAVORITE = "favorite";
public FavoriteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_FAVOURITE_TABLE = "CREATE TABLE " + TABLE_FAVOURITE_NAME + "("
+ KEY_ID + " INTEGER,"
+ KEY_TITLE + " TEXT,"
+ KEY_TEXT + " TEXT,"
+ KEY_FAVORITE + "FAVORITE"
+ ")";
db.execSQL(CREATE_FAVOURITE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVOURITE_NAME);
// Create tables again
onCreate(db);
}
public boolean getFavouriteById(String story_id) {
boolean count = false;
SQLiteDatabase db = this.getWritableDatabase();
String[] args = new String[]{story_id};
Cursor cursor = db.rawQuery("SELECT id FROM favourite WHERE id=? ", args);
if (cursor.moveToFirst()) {
count = true;
}
cursor.close();
db.close();
return count;
}
public void removeFavouriteById(String _id) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM favourite " + " WHERE " + KEY_ID + " = " + _id);
db.close();
}
public long addFavourite(String TableName, ContentValues contentvalues, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
return db.insert(TableName, s1, contentvalues);
}
public ArrayList<ItemStory> getFavourite() {
ArrayList<ItemStory> chapterList = new ArrayList<>();
String selectQuery = "SELECT * FROM "
+ TABLE_FAVOURITE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
ItemStory contact = new ItemStory();
contact.setId(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ID)));
contact.setStoryTitle(cursor.getString(cursor.getColumnIndexOrThrow(KEY_TITLE)));
contact.setStoryText(cursor.getString(cursor.getColumnIndexOrThrow(KEY_TEXT)));
contact.setStoryFavorite(cursor.getString(cursor.getColumnIndexOrThrow(KEY_FAVORITE)));
chapterList.add(contact);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return chapterList;
}
}
Сам лог вылета:
1573925327.481 3993-3993/com.spravochnik.glavnaya E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.spravochnik.glavnaya, PID: 3993
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.example.glavnaya.utils.FavoriteHelper.getFavouriteById(java.lang.String)' on a null object reference
at com.example.glavnaya.game_view.isFavourite(game_view.java:112)
Жалуется на отстутствие значения..но у меня даже желтых предупреждении нет.
Я обратил внимание, что если взять кусок кода
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
и заменить на
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_story, menu);
this.menu = menu;
isFavourite();
return true;
}
То вылетает уже при заходе на саму страницу game_view
В чем тогда может быть вылет?
Но именно по моей теме, нет ни одного конкретного урока или статьи. В этом то и проблема, что я не могу уловить сути от которой можно отталкиваться. Вот и прошу, пример исходного кода или статью на английском/русском/индийском с пояснениями.
– Boglik Nov 15 '19 at 08:23