简体   繁体   English

Android SQLitedatabase删除行NullPointerException

[英]Android SQLitedatabase delete row NullPointerException

When I try to delete one of my Username/Password/Email listview rows in my Admin class I'm getting a NullPointerException from my deletePlayer in my DBAdapter class.I know the NPE is coming from my delete method since when I remove the db.delete,open and close my toast works on the onclick but when I implement them I get the NPE.I'm pretty sure it's my delete method but I've tried searching all over for the right delete method I could use but I'm not finding one that involves removing the USERNAME,PASSWORD and EMAIL columns of the user in the Database. 当我尝试删除Admin类中的用户名/密码/电子邮件列表视图行之一时,我从DBAdapter类的deletePlayer中收到了NullPointerException。我知道自删除数据库以来,NPE来自我的delete方法。删除,打开和关闭我的吐司在onclick上起作用,但是当我实现它们时,我得到了NPE。我很确定这是我的delete方法,但是我尝试了遍地搜索可以使用的正确的delete方法,但是找不到与删除数据库中用户的USERNAME,PASSWORD和EMAIL列有关的内容。

UPDATE:I included the DBAdapter(context) and included my cursor into the deletePlayer method in my database but now I got a code 1 syntax error as seen in the LogCat 更新:我包括了DBAdapter(context)并将光标包含到数据库的deletePlayer方法中,但是现在我得到了代码1语法错误,如LogCat所示

LogCat LogCat

    04-20 14:56:51.289: E/Trace(20896): error opening trace file: No such file or directory (2)
04-20 14:56:51.664: D/dalvikvm(20896): GC_FOR_ALLOC freed 78K, 11% free 8200K/9119K, paused 34ms, total 34ms
04-20 14:56:52.344: D/libEGL(20896): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-20 14:56:52.797: D/libEGL(20896): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-20 14:56:52.805: D/libEGL(20896): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-20 14:56:53.360: D/OpenGLRenderer(20896): Enabling debug mode 0
04-20 14:57:00.000: D/dalvikvm(20896): GC_CONCURRENT freed 66K, 3% free 9899K/10147K, paused 14ms+2ms, total 86ms
04-20 14:59:07.102: E/Trace(21554): error opening trace file: No such file or directory (2)
04-20 14:59:07.164: D/dalvikvm(21554): GC_FOR_ALLOC freed 61K, 11% free 8200K/9119K, paused 29ms, total 29ms
04-20 14:59:07.696: D/libEGL(21554): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-20 14:59:07.891: D/libEGL(21554): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-20 14:59:07.899: D/libEGL(21554): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-20 14:59:08.149: D/OpenGLRenderer(21554): Enabling debug mode 0
04-20 14:59:10.672: E/SQLiteLog(21554): (1) near ".": syntax error
04-20 14:59:10.672: D/AndroidRuntime(21554): Shutting down VM
04-20 14:59:10.672: W/dalvikvm(21554): threadid=1: thread exiting with uncaught exception (group=0x419742a0)
04-20 14:59:10.891: E/AndroidRuntime(21554): FATAL EXCEPTION: main
04-20 14:59:10.891: E/AndroidRuntime(21554): android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: DELETE FROM PLAYERS WHERE _id = android.database.sqlite.SQLiteCursor@4230c108
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1491)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at com.fullfrontalgames.numberfighter.DBAdapter.deletePlayer(DBAdapter.java:106)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at com.fullfrontalgames.numberfighter.Admin$MyListAdapter$1.onClick(Admin.java:66)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.view.View.performClick(View.java:4106)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.view.View$PerformClick.run(View.java:17052)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.os.Handler.handleCallback(Handler.java:615)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.os.Looper.loop(Looper.java:137)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at android.app.ActivityThread.main(ActivityThread.java:5059)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at java.lang.reflect.Method.invokeNative(Native Method)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at java.lang.reflect.Method.invoke(Method.java:511)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
04-20 14:59:10.891: E/AndroidRuntime(21554):    at dalvik.system.NativeStart.main(Native Method)
04-20 14:59:10.961: D/dalvikvm(21554): GC_CONCURRENT freed 88K, 3% free 9886K/10147K, paused 13ms+5ms, total 75ms
04-20 14:59:13.172: I/Process(21554): Sending signal. PID: 21554 SIG: 9
04-20 15:03:13.141: E/Trace(22194): error opening trace file: No such file or directory (2)
04-20 15:03:13.399: D/dalvikvm(22194): GC_FOR_ALLOC freed 79K, 11% free 8200K/9119K, paused 57ms, total 58ms
04-20 15:03:13.844: D/libEGL(22194): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-20 15:03:13.883: D/libEGL(22194): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-20 15:03:13.891: D/libEGL(22194): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-20 15:03:14.055: D/OpenGLRenderer(22194): Enabling debug mode 0
04-20 15:03:17.352: E/SQLiteLog(22194): (1) near ".": syntax error
04-20 15:03:17.375: D/AndroidRuntime(22194): Shutting down VM
04-20 15:03:17.375: W/dalvikvm(22194): threadid=1: thread exiting with uncaught exception (group=0x419742a0)
04-20 15:03:17.414: E/AndroidRuntime(22194): FATAL EXCEPTION: main
04-20 15:03:17.414: E/AndroidRuntime(22194): android.database.sqlite.SQLiteException: near ".": syntax error (code 1): , while compiling: DELETE FROM PLAYERS WHERE _id = android.database.sqlite.SQLiteCursor@4230c2a8
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1491)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at com.fullfrontalgames.numberfighter.DBAdapter.deletePlayer(DBAdapter.java:106)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at com.fullfrontalgames.numberfighter.Admin$MyListAdapter$1.onClick(Admin.java:66)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.view.View.performClick(View.java:4106)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.view.View$PerformClick.run(View.java:17052)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.os.Handler.handleCallback(Handler.java:615)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.os.Looper.loop(Looper.java:137)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at android.app.ActivityThread.main(ActivityThread.java:5059)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at java.lang.reflect.Method.invokeNative(Native Method)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at java.lang.reflect.Method.invoke(Method.java:511)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
04-20 15:03:17.414: E/AndroidRuntime(22194):    at dalvik.system.NativeStart.main(Native Method)

DBAdapter class DBAdapter类

package com.fullfrontalgames.numberfighter;

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.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
    static final String KEY_ROWID = "_id";

    static final String KEY_USERNAME = "USERNAME";

    static final String KEY_PASSWORD = "PASSWORD";

    static final String KEY_EMAIL = "EMAIL";

    static final String KEY_NUMBERINPUT = "NUMBERINPUT";

    static final String KEY_SCORE = "SCORE";

    static final String KEY_FRIENDS = "FRIENDS";

    static final String TAG = "DBAdapter";

    static final String DATABASE_NAME = "NFDatabase";

    static final String DATABASE_TABLE1 = "PLAYERS";

    static final String DATABASE_TABLE2 = "FRIENDSLIST";

    static final int DATABASE_VERSION = 2;

    static final String DATABASE_CREATE_TABLE1 = "create table PLAYERS ( _id integer primary key autoincrement, "
            + "USERNAME text not null,PASSWORD text not null,EMAIL text,NUMBERINPUT text,SCORE text);";

    static final String DATBASE_CREATE_TABLE2 = "create table FRIENDSLIST (_id integer primary key autoincrement,"
            + "FRIENDS text not null,USERNAME text not null,NUMBERINPUT text,SCORE text);";

    final Context context;

    DatabaseHelper DBHelper;

    static SQLiteDatabase db;

    public DBAdapter(Context ctx) {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {

        public DatabaseHelper(Context context) {
            // TODO Auto-generated constructor stub
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            try {
                db.execSQL(DATABASE_CREATE_TABLE1);
                db.execSQL(DATBASE_CREATE_TABLE2);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
                    + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS PLAYERS");
            db.execSQL("DROP TABLE IF EXISTS FRIENDSLIST");
            onCreate(db);
        }

    }

    public DBAdapter open() throws SQLiteException {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        DBHelper.close();
    }

    // PLAYERS TABLE CRUD

    public void insertPlayer(String Username, String Password, String Email) {
        ContentValues initialValues = new ContentValues();
        initialValues.put("USERNAME", Username);
        initialValues.put("PASSWORD", Password);
        initialValues.put("EMAIL", Email);

        db.insert("PLAYERS", null, initialValues);
    }

    public boolean deletePlayer(Cursor playeraccounts) {
        return db.delete("PLAYERS", KEY_ROWID + " = " + playeraccounts, null) > 0;
    }

    public Cursor getAllPlayers() {
        return db.query(false, "Players", new String[] {
                "_id", "USERNAME", "PASSWORD", "EMAIL"
        }, null, null, null, null, null, null);

    }

    public String getData() {
        String[] columns = new String[] {
                "_id", "USERNAME", "PASSWORD"
        };
        Cursor mCursor = db.query("PLAYERS", columns, null, null, null, null, null);
        String result = "";
        int iRow = mCursor.getColumnIndex(KEY_ROWID);
        int iName = mCursor.getColumnIndex(KEY_USERNAME);

        for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {
            result = mCursor.getString(iRow) + " " + mCursor.getString(iName) + "/n";
        }
        return result;
    }

    public Cursor getPlayer(long rowid) throws SQLException {
        Cursor mCursor = db.query(true, "PLAYERS", new String[] {
                "_id", "USERNAME"
        }, KEY_ROWID + " =  " + "_id", null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public String getUsername(String username) {
        // TODO Auto-generated method stub
        String[] columns = new String[] {
                "_id", "USERNAME"
        };
        Cursor mCursor = db.query("PLAYERS", columns, null, null, null, null, null);
        String result = "";
        int iRow = mCursor.getColumnIndex(KEY_ROWID);
        int iName = mCursor.getColumnIndex(KEY_USERNAME);

        for (mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()) {
            result = mCursor.getString(iRow) + " " + mCursor.getString(iName) + "/n";
        }
        return result;
    }

    public String getSinlgeEntry(String Username) {
        Cursor cursor = db.query("PLAYERS", null, " USERNAME=?", new String[] {
            Username
        }, null, null, null);
        if (cursor.getCount() < 1) // UserName Not Exist
        {
            cursor.close();
            return "NOT EXIST";
        }
        cursor.moveToFirst();
        String password = cursor.getString(cursor.getColumnIndex("PASSWORD"));
        cursor.close();
        return password;
    }

    public boolean updatePlayer(long _id, String Username, String Password, String Email) {
        ContentValues args = new ContentValues();
        args.put("USERNAME", Username);
        args.put("PASSWORD", Password);
        args.put("EMAIL", Email);
        return db.update("PLAYERS", args, KEY_ROWID + " = " + _id, null) > 0;
    }

    // FRIENDS TABLE CRUD

    public void insertFriend(String Friend) {
        ContentValues initialValues = new ContentValues();
        initialValues.put("FRIENDS", Friend);
        db.insert("FRIENDSLIST", null, null);
    }

    public boolean deleteFriend() {
        return db.delete("FRIENDSLIST", KEY_ROWID + " = " + "_id", null) > 0;
    }

    public Cursor getAllFriends() {
        return db.query(null, new String[] {
                "_id", "FRIENDS"
        }, null, null, null, null, null, null);
    }

    public Cursor getFriend(long rowid) throws SQLException {
        Cursor mCursor = db.query(true, "FRIENDSLIST", new String[] {
                "_id", "FRIENDS"
        }, KEY_ROWID + " =  " + "_id", null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    public boolean updateFriend(long _id, String Friends) {
        ContentValues args = new ContentValues();
        args.put("FRIENDS", Friends);

        return db.update("FRIENDSLIST", args, KEY_ROWID + " = " + _id, null) > 0;
    }

}

Admin Class 管理员班

package com.fullfrontalgames.numberfighter;

import android.app.ListActivity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.ResourceCursorAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class Admin extends ListActivity {

    DBAdapter db;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.admin);

        DBAdapter db = new DBAdapter(this);
        db.open();

        ListView UsernameList = (ListView)findViewById(android.R.id.list);
        Button deleteplayer = (Button)findViewById(R.id.PlayerDelete);

        Cursor playeraccounts = db.getAllPlayers();
        startManagingCursor(playeraccounts);
        setListAdapter(new MyListAdapter(this, R.layout.admin, playeraccounts));

    }

    private class MyListAdapter extends ResourceCursorAdapter {
        DBAdapter db;

        public MyListAdapter(Context context, int layout, Cursor cursor) {
            super(context, R.layout.admin, cursor);
            // TODO Auto-generated constructor stub

        }

        @Override
        public void bindView(View view, final Context context, final Cursor playeraccounts) {

            final TextView PlayerName = (TextView)findViewById(R.id.AdminUsername);
            final TextView PlayerPass = (TextView)findViewById(R.id.AdminPassword);
            final TextView PlayerEmail = (TextView)findViewById(R.id.AdminEmail);

            PlayerName.setText(playeraccounts.getString(playeraccounts.getColumnIndex("USERNAME")));
            PlayerPass.setText(playeraccounts.getString(playeraccounts.getColumnIndex("PASSWORD")));
            PlayerEmail.setText(playeraccounts.getString(playeraccounts.getColumnIndex("EMAIL")));
            Button deleteplayer = (Button)findViewById(R.id.PlayerDelete);
            deleteplayer.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Auto-generated method stub
                    DBAdapter db = new DBAdapter(context);
                    db.open();
                    db.deletePlayer(playeraccounts);
                    Toast.makeText(getBaseContext(), "Player Deleted", Toast.LENGTH_SHORT).show();
                    MyListAdapter.this.notifyDataSetChanged();
                    db.close();

                }
            });

        }

    }

}

Your db ie DBAdapter is Null, 您的数据库,即DBAdapter为Null,

When you are trying to perform operation on it 当您尝试对其进行操作时

ie

db.open(); will throw NullPointerException 将抛出NullPointerException

So try to instantiate db in the constructor of your adapter 因此,尝试在适配器的构造函数中实例化db

db=new DBAdapter(context); when you are using them in separate classess.

or declare db as field and then use it . 或将db声明为字段,然后使用它。 remove new object in Adapter. 在适配器中删除新对象。

You have two DBAdapter db objects. 您有两个DBAdapter db对象。 The one in onCreate() is initialized, while the one in MyListAdapter class remains null. onCreate()中的一个被初始化,而MyListAdapter class的一个保持为空。

You should maintain only one db object, or initialize both. 您应该仅维护一个db对象,或者同时初始化两者。

This should work. 这应该工作。

public class Admin extends ListActivity {

DBAdapter db;

@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.admin);

    db = new DBAdapter(this);
    db.open();

    ListView UsernameList = (ListView)findViewById(android.R.id.list);
    Button deleteplayer = (Button)findViewById(R.id.PlayerDelete);

    Cursor playeraccounts = db.getAllPlayers();
    startManagingCursor(playeraccounts);
    setListAdapter(new MyListAdapter(this, R.layout.admin, playeraccounts));

}

private class MyListAdapter extends ResourceCursorAdapter {


    public MyListAdapter(Context context, int layout, Cursor cursor) {
        super(context, R.layout.admin, cursor);
        // TODO Auto-generated constructor stub

    }

    @Override
    public void bindView(View view, Context context, Cursor playeraccounts) {

        final TextView PlayerName = (TextView)findViewById(R.id.AdminUsername);
        final TextView PlayerPass = (TextView)findViewById(R.id.AdminPassword);
        final TextView PlayerEmail = (TextView)findViewById(R.id.AdminEmail);

        PlayerName.setText(playeraccounts.getString(playeraccounts.getColumnIndex("USERNAME")));
        PlayerPass.setText(playeraccounts.getString(playeraccounts.getColumnIndex("PASSWORD")));
        PlayerEmail.setText(playeraccounts.getString(playeraccounts.getColumnIndex("EMAIL")));
        Button deleteplayer = (Button)findViewById(R.id.PlayerDelete);
        deleteplayer.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                db.open();
                db.deletePlayer(0);
                Toast.makeText(getBaseContext(), "Player Deleted", Toast.LENGTH_SHORT).show();
                MyListAdapter.this.notifyDataSetChanged();
                db.close();

            }
        });

    }

}

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM