错误:无法对Android数据库中的非静态字段db进行静态引用。 [英] Error: Cannot make a static reference to the non-static field db in Android database.

查看:61
本文介绍了错误:无法对Android数据库中的非静态字段db进行静态引用。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

//维护数据库的DBAdapter.java代码



 package com.example.databases; 

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;

public class DBAdapter
{
public static final String KEY_ROWID =_ id;
public static final String KEY_NAME =name;
public static final String KEY_EMAIL =email;
private static final String TAG =DBAdapter;
private static final String DATABASE_NAME =MyDB;
private static final String DATABASE_TABLE =contacts;
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =create table contacts(_id integer primary key autoincrement,+
name text not null,email text not null);;

私有最终上下文上下文;
private DatabaseHelper DBHelper;
私有SQLiteDatabase db;

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

私有静态类DatabaseHelper扩展SQLiteOpenHelper
{
DatabaseHelper(上下文上下文)
{
super(context,DATABASE_NAME,null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db)
{
try
{
db.execSQL(DATABASE_CREATE) );
}
catch(SQLException e)
{
e.printStackTrace();
}
}

@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
{
Log.w(标签,从版本更新数据库+ oldVersion +到+ newVersion +将破坏所有旧数据);
db.execSQL(DROP TABLE IF EXISTS contacts);
onCreate(db);
}

//打开数据库
public DBAdapter open()抛出SQLException
{
db = DBHelper.getWritableDatabase();
返回此;
}

//关闭数据库
public void close()
{
DBHelper.close();
}

//在数据库中插入联系人
public long insertContact(String name,String email)
{
ContentValues initialValues = new ContentValues( );
initialValues.put(KEY_NAME,name);
initialValues.put(KEY_EMAIL,email);
返回db.insert(DATABASE_TABLE,null,initialValues);
}

//删除特定联系人
public boolean deleteContact(long rowId)
{
return db.delete(DATABASE_TABLE,KEY_ROWID += + ROWID,NULL)大于0;
}

//检索所有联系人
public Cursor getAllContacts()
{
return db.query(DATABASE_TABLE,new String [] {KEY_ROWID, KEY_NAME,KEY_EMAIL},NULL,NULL,NULL,NULL,NULL);
}

//检索特定联系人
public Cursor getContact(long rowId)抛出SQLException
{
Cursor mCursor = db.query(true, DATABASE_TABLE,new String [] {KEY_ROWID,KEY_NAME,KEY_EMAIL},KEY_ROWID +=+ rowId,
null,null,null,null,null);
if(mCursor!= null)
{
mCursor.moveToFirst();
}
返回mCursor;
}

//更新联系人
public boolean updateContact(long rowId,String name,String email)
{
ContentValues args = new ContentValues( );
args.put(KEY_NAME,姓名);
args.put(KEY_EMAIL,email);
返回db.update(DATABASE_TABLE,args,KEY_ROWID +=+ rowId,null);
}
}
}

解决方案

无论错误在哪里,这都是不可能的, 无论你做什么。根据定义,任何静态成员都不能访问与实例相关的任何内容。当然,它可以通过类访问,而无需任何实例。



怎么办?这取决于你想要达到的目标。也许您可以将静态成员转换为实例1(删除静态),或者您实际上不需要和访问该实例,而不是将其保持静态,不解决实例或将其他内容转为静态(这通常比拥有所有实例更糟糕;静态的唯一完全保存使用是一些纯功能函数,仅基于参数,返回值和堆栈的函数。所以,首先,您应该完全理解静态与实例成员,然后根据这种理解决定如何设计代码。



- SA

//The code for DBAdapter.java which maintains the database

package com.example.databases;

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;

public class DBAdapter
{
	public static final String KEY_ROWID="_id";
	public static final String KEY_NAME="name";
	public static final String KEY_EMAIL="email";
	private static final String TAG="DBAdapter";
	private static final String DATABASE_NAME="MyDB";
	private static final String DATABASE_TABLE="contacts";
	private static final int DATABASE_VERSION=1;
	private static final String DATABASE_CREATE="create table contacts(_id integer primary key autoincrement,"+
												"name text not null,email text not null);";
	
	private final Context context;
	private DatabaseHelper DBHelper;
	private SQLiteDatabase db;
	
	public DBAdapter(Context ctx)
	{
		this.context=ctx;
		DBHelper=new DatabaseHelper(context);
	}
	
	private static class DatabaseHelper extends SQLiteOpenHelper
	{
		DatabaseHelper(Context context)
		{
			super(context,DATABASE_NAME,null,DATABASE_VERSION);
		}
		
		@Override
		public void onCreate(SQLiteDatabase db)
		{
			try
			{
				db.execSQL(DATABASE_CREATE);
			}
			catch(SQLException e)
			{
				e.printStackTrace();
			}
		}
		
		@Override
		public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
		{
			Log.w(TAG,"Updating database from version"+oldVersion+"to"+newVersion+" which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS contacts");
			onCreate(db);
		}
		
		//opens the database
		public DBAdapter open() throws SQLException
		{
			db=DBHelper.getWritableDatabase();
			return this;
		}
		
		//closes the database
		public void close()
		{
			DBHelper.close();
		}
		
		//insert a contact into the database
		public long insertContact(String name,String email)
		{
			ContentValues initialValues=new ContentValues();
			initialValues.put(KEY_NAME,name);
			initialValues.put(KEY_EMAIL,email);
			return db.insert(DATABASE_TABLE,null,initialValues);
		}
		
		//deletes a particular contact
		public boolean deleteContact(long rowId)
		{
			return db.delete(DATABASE_TABLE,KEY_ROWID+"="+rowId,null)>0;
		}
		
		//retrieves all contacts
		public Cursor getAllContacts()
		{
			return db.query(DATABASE_TABLE,new String[]{KEY_ROWID,KEY_NAME,KEY_EMAIL},null,null,null,null,null);
		}
		
		//retrieves a particular contact
		public Cursor getContact(long rowId) throws SQLException
		{
			Cursor mCursor=db.query(true,DATABASE_TABLE,new String[] {KEY_ROWID,KEY_NAME,KEY_EMAIL},KEY_ROWID+"="+rowId,
					null,null,null,null,null);
			if(mCursor!=null)
			{
				mCursor.moveToFirst();
			}
			return mCursor;
		}
		
		//updates a contact
		public boolean updateContact(long rowId,String name,String email)
		{
			ContentValues args=new ContentValues();
			args.put(KEY_NAME,name);
			args.put(KEY_EMAIL,email);
			return db.update(DATABASE_TABLE,args,KEY_ROWID+"="+rowId,null);
		}
	}
}

解决方案

No matter where the error is, this is just impossible, no matter what you do. Any static member, by definition, is the one which has no access to anything related to an instance. Naturally, it's accessed via the class, without a need to have any instance.

What to do? It depends on what you want to achieve. Perhaps you can turn a static member to instance one (remove "static"), or you don't actually need and access to the instance, than you can leave it static, don't address instance or turn something else "static" (this is usually worse than having all instance; the only fully save use of static is some purely functional function, those based only on parameters, return value, and stack). So, first, you should come to perfect understanding of static vs. instance member, then decide how you should design your code based on that understanding.

—SA


这篇关于错误:无法对Android数据库中的非静态字段db进行静态引用。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆