我正在尝试从sqlite中检索数据但是我的应用程序一直在崩溃。我不知道错误是什么。我只是Android编程的初学者。这是我的代码:
MainActivity.java
package com.the.voiceapplock;
import com.the.voiceapplock.adapter.*;
import com.the.voiceapplock.db.ProtectAppProvider;
import com.the.voiceapplock.domain.Model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.app.Activity;
import android.content.pm.*;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class MainActivity extends Activity implements OnCheckedChangeListener
{
private ListView list;
ArrayList<Model> data;
ApkAdapter adapter;
private PackageManager packageManager;
TextView tView;
ProtectAppProvider pap;
CheckBox chk;
ArrayList<String> protectedApps;
List<PackageInfo> appsList;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
packageManager = getPackageManager();
tView = (TextView) findViewById(R.id.appname);
list = (ListView) findViewById(R.id.applist);
appsList = getPackageManager().getInstalledPackages(0);
data = new ArrayList<Model>();
for (int i = 0; i < appsList.size(); i++)
{
PackageInfo p = appsList.get(i);
if (((packageManager.getLaunchIntentForPackage(p.packageName) != null)))
{
Model model = new Model();
model.setAppName(p.applicationInfo.loadLabel(getPackageManager()).toString());
model.setAppIcon(p.applicationInfo.loadIcon((getPackageManager())));
data.add(model);
Collections.sort(data,Model.AppComparator);
}
}
adapter = new ApkAdapter(MainActivity.this, data,packageManager,protectedApps);
adapter.notifyDataSetChanged();
list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_bar, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
boolean diditwork = true;
int getPosition = (Integer) buttonView.getTag();
Model obj = data.get(getPosition);
data.get(getPosition).setSelected(isChecked);
String apps = obj.getAppName();
protectedApps = new ArrayList<String>();
pap = new ProtectAppProvider(getApplicationContext());
if(((CheckBox) buttonView).isChecked()){
try {
protectedApps.add(apps);
ProtectAppProvider entry = new ProtectAppProvider(MainActivity.this);
entry.open();
entry.createEntry(apps);
entry.close();
}catch(Exception e){
diditwork = false;
}finally{
if(diditwork){
Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this, "Fail", Toast.LENGTH_SHORT).show();
}
}
}
}
}
ApkAdapter.java
package com.the.voiceapplock.adapter;
import java.util.ArrayList;
import java.util.List;
import com.the.voiceapplock.MainActivity;
import com.the.voiceapplock.R;
import com.the.voiceapplock.db.ProtectAppProvider;
import com.the.voiceapplock.domain.Model;
import android.app.*;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.*;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.drawable.*;
import android.view.*;
import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class ApkAdapter extends BaseAdapter {
Context ctx;
LayoutInflater inflater;
public ArrayList<Model> data;
PackageManager p;
ProtectAppProvider pap;
private ArrayList<String> protectapps;
public ApkAdapter(Context c, ArrayList<Model> arraylist, PackageManager p, ArrayList<String> protectApps ) {
this.ctx = c;
this.data = arraylist;
this.p = p;
this.protectapps = protectApps;
this.pap = new ProtectAppProvider(ctx);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
inflater = (LayoutInflater) ctx.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.apklist_item, parent, false);
final CheckBox checks = (CheckBox) itemView.findViewById(R.id.checkBox1);
final TextView setappname = (TextView) itemView.findViewById(R.id.appname);
final ImageView appicon = (ImageView) itemView.findViewById(R.id.appicon);
checks.setChecked(data.get(position).isSelected());
Model obj = data.get(position);
setappname.setTextColor(Color.BLACK);
setappname.setText(obj.getAppName());
setappname.setCompoundDrawablePadding(15);
appicon.setImageDrawable(obj.getAppIcon());
checks.setTag(position);
checks.setOnCheckedChangeListener((MainActivity)ctx);
String appname = "";
pap.open();
Cursor c = pap.getData();
if(c.moveToFirst())
{
do{
appname = c.getString(0);
protectapps.add(appname);
}while(c.moveToNext());
}
pap.close();
return itemView;
}
}
ProtectAppProvider.java
package com.the.voiceapplock.db;
import android.content.*;
import android.database.*;
import android.database.sqlite.*;
public class ProtectAppProvider {
public static final String KEY_NAME = "appName";
public static final String DATABASE_NAME = "AppLock";
public static final String DATABASE_TABLE = "appTable";
public static final int DATABASE_VERSION = 1;
private DBHelper dbHelper;
private final Context context;
private SQLiteDatabase sqlDB;
private static class DBHelper extends SQLiteOpenHelper{
public DBHelper(Context context){
super(context,DATABASE_NAME ,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+DATABASE_TABLE+" ("+KEY_NAME+" TEXT NOT NULL)" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_NAME);
onCreate(db);
}
}
public ProtectAppProvider(Context context){
this.context = context;
}
public ProtectAppProvider open() throws SQLException{
dbHelper = new DBHelper(context);
sqlDB = dbHelper.getWritableDatabase();
return this;
}
public void close(){
dbHelper.close();
}
public long createEntry(String apps) {
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, apps);
return sqlDB.insert(DATABASE_TABLE, null, cv);
}
public Cursor getData(){
String[] columns = new String[]{KEY_NAME};
return sqlDB.query(DATABASE_TABLE,columns, null, null, null, null, null);
}
}
logcat的 (这里是logcat中的消息)
09-09 10:54:22.975: D/AbsListView(12413): Get MotionRecognitionManager
09-09 10:54:23.665: I/dalvikvm-heap(12413): Grow heap (frag case) to 23.887MB for 4194320-byte allocation
09-09 10:54:24.085: D/TextLayoutCache(12413): Enable myanmar Zawgyi converter
09-09 10:54:24.095: D/TextLayoutCache(12413): Enable myanmar Zawgyi converter
09-09 10:54:24.105: D/AndroidRuntime(12413): Shutting down VM
09-09 10:54:24.105: W/dalvikvm(12413): threadid=1: thread exiting with uncaught exception (group=0x4184ada0)
09-09 10:54:24.115: E/AndroidRuntime(12413): FATAL EXCEPTION: main
09-09 10:54:24.115: E/AndroidRuntime(12413): Process: com.the.voiceapplock, PID: 12413
09-09 10:54:24.115: E/AndroidRuntime(12413): java.lang.NullPointerException
09-09 10:54:24.115: E/AndroidRuntime(12413): at com.the.voiceapplock.adapter.ApkAdapter.getView(ApkAdapter.java:78)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.AbsListView.obtainView(AbsListView.java:2758)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.ListView.measureHeightOfChildren(ListView.java:1274)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.ListView.onMeasure(ListView.java:1186)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.View.measure(View.java:17515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.View.measure(View.java:17515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.View.measure(View.java:17515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380)
09-09 10:54:24.115: E/AndroidRuntime(12413): at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:412)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.View.measure(View.java:17515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5380)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
09-09 10:54:24.115: E/AndroidRuntime(12413): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2567)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.View.measure(View.java:17515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2287)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1398)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1597)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1256)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6652)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.Choreographer.doCallbacks(Choreographer.java:613)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.Choreographer.doFrame(Choreographer.java:583)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.os.Handler.handleCallback(Handler.java:733)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.os.Handler.dispatchMessage(Handler.java:95)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.os.Looper.loop(Looper.java:146)
09-09 10:54:24.115: E/AndroidRuntime(12413): at android.app.ActivityThread.main(ActivityThread.java:5653)
09-09 10:54:24.115: E/AndroidRuntime(12413): at java.lang.reflect.Method.invokeNative(Native Method)
09-09 10:54:24.115: E/AndroidRuntime(12413): at java.lang.reflect.Method.invoke(Method.java:515)
09-09 10:54:24.115: E/AndroidRuntime(12413): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
09-09 10:54:24.115: E/AndroidRuntime(12413): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
09-09 10:54:24.115: E/AndroidRuntime(12413): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
来自logcat stacktrace,
java.lang.NullPointerException at com.the.voiceapplock.adapter.ApkAdapter.getView(ApkAdapter.java:78)
在ApkAdapter
课程的第78行,为什么它显示NullPointerException
,因为您还没有在ArrayList
实例化。如果您看到MainActivity
,就行了你已经实例化了ArrayList
。你需要在ApkAdapter
中做类似的事情。
在ApkAdapter
班级getView(final int position, View convertView, ViewGroup parent)
内,添加此行
protectedApps = new ArrayList<String>();