java - 无法从 SD 卡访问数据库文件

标签 java android

我创建了 sdcard 并在其中保存了数据库文件 UPData.db。在这个数据库中,我创建了一个名为 Customer 的表,但没有得到结果。正在显示 DBList 中的 NullPointerException。请帮助我按照相同的结构执行此操作?

activity_up.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UP"
    android:orientation="vertical">
    <LinearLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UserName" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="UserName" 
        android:id="@+id/un"/>
    </LinearLayout>
    <LinearLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PassWord" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="PassWord"
        android:id="@+id/pw" />
    </LinearLayout>
    <Button android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Submit"
        android:id="@+id/submit"/>

</LinearLayout>

res/layout/list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UP"
   >
   <ListView 
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/listview"></ListView>

</LinearLayout>

viewholder.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UP"
   android:orientation="vertical">
   <TextView 
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/tvid"/>
   <TextView 
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/tvname"/>
   <TextView 
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/tvaddress"/>
   <TextView 
       android:layout_height="wrap_content"
       android:layout_width="wrap_content"
       android:id="@+id/tvphone"/>

</LinearLayout>


**manifest.xml**

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.up"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        android:name="Main">
        <activity
            android:name="com.example.up.UP"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ShowList"></activity>
    </application>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>


**UP.java**

package com.example.up;
public class UP extends Activity {
    EditText un,pw;
    Button submit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_up);
        un=(EditText)findViewById(R.id.un);
        pw=(EditText)findViewById(R.id.pw);
        submit=(Button)findViewById(R.id.submit);

        submit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String user=un.getText().toString();
                String pwd=pw.getText().toString();
                System.out.println("user--"+user +"&&"+"Password is--"+pwd);
                Intent showlist=new Intent(UP.this,ShowList.class);
                startActivity(showlist);

            }
        });
    }


}

**ShowList.java**

package com.example.up;
public class ShowList extends Activity {
    ListView list;
    ArrayList<ListData> alist;
    ArrayList<ListData> achildlist;
    ArrayAdapter<String> adapter;
    int id=-1;
    Cursor cur=null;
    ListData listdata;
    DBHelper help;
    DBList dblist;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);
        list=(ListView)findViewById(R.id.listview);

        loadData();

    }
    public void loadData(){
        try{
            alist=new ArrayList<ShowList.ListData>();
            dblist=new DBList(this);
            cur=dblist.getListData(this);

            if(cur!=null){
                if(cur.moveToFirst()){
                    do{
                        listdata=new ListData();
                        listdata.setCustomerId(cur.getInt(cur.getColumnIndex("customerId")));
                        listdata.setCustomerName(cur.getString(cur.getColumnIndex("customerName")));
                        listdata.setCustomerName(cur.getString(cur.getColumnIndex("customerAddress")));
                        listdata.setCustomerId(cur.getInt(cur.getColumnIndex("phone")));

                        String id=Integer.toString(cur.getInt(cur.getColumnIndex("customerId")));
                        System.out.println(id);

                        alist.add(listdata);
                    }while(cur.moveToNext());
                }
                cur.close();
            }
            list.setAdapter(new ListDataAdapter(this,alist));
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    class ListDataAdapter extends BaseAdapter{

        Context con;
        ListDataAdapter(Context c,ArrayList<ListData> listadapter){
            this.con=c;
            achildlist=listadapter;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return achildlist.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return achildlist.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            ViewHolder obj=null;
            try{
                if(arg1==null){
            obj=new ViewHolder();
            LayoutInflater vi=(LayoutInflater)getSystemService(Context.LOCATION_SERVICE);
            arg1=vi.inflate(R.layout.viewholder, null);
            obj.tvid=(TextView)arg1.findViewById(R.id.tvid);
            obj.tvname=(TextView)arg1.findViewById(R.id.tvname);
            obj.tvaddress=(TextView)arg1.findViewById(R.id.tvaddress);
            obj.tvphone=(TextView)arg1.findViewById(R.id.tvphone);
            arg1.setTag(obj);
                }else{
                    obj=(ViewHolder)arg1.getTag();
                }
                if(obj!=null){
                    ListData listdata=achildlist.get(arg0);
                    obj.tvid.setText(listdata.getCustomerId());
                    obj.tvname.setText(listdata.getCustomerName());
                    obj.tvaddress.setText(listdata.getCustomerAddress());
                    obj.tvphone.setText(listdata.getPhone());
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return arg1;

        }

    }
    class ViewHolder {
        TextView tvid;
        TextView tvname;
        TextView tvaddress;
        TextView tvphone;
    }
    class ListData{
         int customerId;
         String customerName;
         String customerAddress;
         int phone;

         public int getCustomerId() {
            return customerId;
        }
        public void setCustomerId(int customerId) {
            this.customerId = customerId;
        }
        public String getCustomerName() {
            return customerName;
        }
        public void setCustomerName(String customerName) {
            this.customerName = customerName;
        }
        public String getCustomerAddress() {
            return customerAddress;
        }
        public void setCustomerAddress(String customerAddress) {
            this.customerAddress = customerAddress;
        }
        public int getPhone() {
            return phone;
        }
        public void setPhone(int phone) {
            this.phone = phone;
        }

    }

}

**Main.java**

package com.example.up;    
public class Main extends Application {

        public DBHelper adapter;

}

**DBHelper.java**

package com.example.up; 
public class DBHelper{
    public static final int version = 1;
    public  String DBName = "/sdcard/UPData.db";
    private SQLiteDatabase dbSqlite;
    private Context c;
    public SQHelper openhelper;

    //public static final String PATH_APPLICATION = "/Android/Data/com.example.up/files/";
    //public static final String FOLDER_LOGS = "Logs/";
    //public static final String LOG_FILE_NAME = "ErrorLog.txt";


    public DBHelper(Context context){
        c=context;
        openhelper=new SQHelper(c, DBName, null, version);
    }


    public class SQHelper extends SQLiteOpenHelper{

        public SQHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub

        }

        @Override
        public void onCreate(SQLiteDatabase db) {

             try{
                 System.out.println("inside oncreate of dbhelper+++++++++");
                 File sdcard = Environment.getExternalStorageDirectory();
                   File f = new File(sdcard,"UPData.db");
                   if(!f.exists()){
                       f.createNewFile();
                   }

                   BufferedReader buf = new BufferedReader(new FileReader(f));
                   String readString = new String(); 
                   while((readString = buf.readLine())!= null){

                      Log.d("oncreate of DBHelper in UP..........", readString);
                   }
                } catch (FileNotFoundException e) {
                   e.printStackTrace();
                } catch (IOException e){
                   e.printStackTrace();
                }
            // TODO Auto-generated method stub
            /*try {


                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

                    String strDirPath = Environment.getExternalStorageDirectory().getPath() + PATH_APPLICATION + FOLDER_LOGS;
                    File dirLog = new File(strDirPath);
                    if (!dirLog.isDirectory() || !dirLog.exists()) {
                        dirLog.mkdirs();
                    }
                    //String strLogFile = "Logs_" + CommonMethods.getCurrentDateTime(Values.DATE_FORMAT) + ".txt";
                    String strLogFile = LOG_FILE_NAME;
                    File fileLog = new File(dirLog, strLogFile);
                    if (!fileLog.exists()) {
                        fileLog.createNewFile();
                    }

                    FileWriter fileWrite = new FileWriter(fileLog, true);

                    BufferedWriter bufWriter = new BufferedWriter(fileWrite);

                    //String strLog = CommonMethods.getCurrentDateTime(Values.DATE_TIME_2_FORMAT) + " ERROR : " + strModule + "\t" + strLogData + " ; " + "\r\n";
                    //bufWriter.write(strLog);
                    bufWriter.close();
                    fileWrite.close();

                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }*/

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }   
    public void close() {
        try {
            dbSqlite.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void open() throws SQLiteException {
        try {

            dbSqlite = openhelper.getWritableDatabase();

        } catch (SQLiteException e) {
            dbSqlite = openhelper.getReadableDatabase();
            e.printStackTrace();
        }
    }

    public Cursor getRecordsWithRawQuery(String strSql, String[] sArrSelectionArgs) {
        Cursor cursor = null;
        try {

            cursor = dbSqlite.rawQuery(strSql, sArrSelectionArgs);
        } catch (SQLiteException e) {
            e.printStackTrace();
        }
        return cursor;
    }

    public void executeNonQuery(String strQuery) {
        try {
            dbSqlite.execSQL(strQuery);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}

//这个java类(DBList)我得到了空指针异常。我应该在哪一部分编写代码以从 SD 卡读取表。或者这是必需的还是不需要的!!

DBList.java

package com.example.up; 
public class DBList {

    private  int customerId;
    private  String customerName;
    private  String customerAddress;
    private  int phone;

     Context context;
     Main maincall;
    SQLiteDatabase db;





     public DBList(Context con){
        this.context=con;
        maincall=(Main)context.getApplicationContext();
     }

    public  Cursor getListData(Context context){
        Cursor cur=null;
        try{

            //String query="Select customerId,customerName,customerAddress,phone from Customer where customerId="+id;
            String query="Select customerId,customerName,customerAddress,phone from Customer";
            Main maincall=(Main)context.getApplicationContext();
            cur=maincall.adapter.getRecordsWithRawQuery(query, null);

        }catch(Exception e){
            e.printStackTrace();
        }

            return cur; 
    }
    public void insert(){
        try{
            String query="Insert into Customer(customerId,customerName,customerAddress,phone) Values" +"("+customerId+","+customerName+","+customerAddress+","+phone+")";
            maincall.adapter.executeNonQuery(query);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public  int getCustomerId() {
        return customerId;
    }

    public  void setCustomerId(int customerId) {
        this.customerId = customerId;
    }

    public String getCustomerName() {
        return customerName;
    }
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
    public String getCustomerAddress() {
        return customerAddress;
    }
    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }
    public int getPhone() {
        return phone;
    }
    public void setPhone(int phone) {
        this.phone = phone;
    }

}

最佳答案

最好使用 Assets 文件夹中的数据库...检查此答案,这可能对您有所帮助... copying database file from /assets to /data/data folder in file explorer - Android

关于java - 无法从 SD 卡访问数据库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527131/

相关文章:

java - 使用 Jayway 的可选 JsonPath

java - Android 上的点对点音频通话 : Voice breaks and lag(delay in receiving packets) increases

android - 来自通知的深度链接 - 如何通过后台堆栈传递数据?

java - 扫描仪在程序结束时拾取用户输入的问题

java - 在 BeanPropertyRowMapper 中注册属性转换器

java - 如何在android计算器中获得±的正确功能?

android - Compose ConstraintLayout 是否为 INVISIBLE 和 GONE 提供与基于 View 的 ConstraintLayout 相同的处理?

android - 我有很多按钮和 TextView ,这是定义它们的正确方法吗

java - 是否有类似 javadoc 的工具可以从 JAX-RS 注释生成 RESTful Web 服务 apidoc?

java - 是否可以使用 Office 365 电子邮件的 Java Exchange 服务 API 将组成员添加到组中?