Экземпляр базы данных в классе PortParser равен NULL - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть класс PortParser, который загружает файл, анализирует первые 4 столбца и вставляет их в таблицу.Класс создает экземпляр класса DatabaseHelper как dbHelper.Я обнаружил, что когда внутри метода doInBackground () внутри моего цикла while, параметр

long dbInsert = dbHelper.addTableRecord(service, portNum, protocol, service);

вызывает исключение во второй строке и, следовательно, выходит из цикла while.как я могу это исправить?мой экземпляр dbHelper нулевой?

package org.pctechtips.netdroid.classes;

import android.os.AsyncTask;
import android.content.Context;
import android.util.*;
import org.pctechtips.netdroid.dbhelper.*;
import java.util.*;

import java.io.*;
import java.net.*;
import java.util.zip.*;

import javax.net.ssl.*;

/**
 * Java class to downloand and parse service-port csv file from iana.org
 */

public class PortParser {
    //public static final String PORT_URL = "https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv";
    public static final String PORT_URL = "http://pctechtips.org/apps/service-names-port-numbers.csv";
    org.pctechtips.netdroid.dbhelper.DatabaseHelper dbHelper;
    DownloadPortFile downloadFile;
    android.database.sqlite.SQLiteDatabase db;
    Context context;

    public PortParser(Context ctxt) {
        dbHelper = new org.pctechtips.netdroid.dbhelper.DatabaseHelper(ctxt);
        db = dbHelper.getWritableDatabase();
        downloadFile = new DownloadPortFile();
    }

    public void execute() {
        downloadFile.execute();
    }


    public class DownloadPortFile extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            BufferedReader in = null;
            HttpsURLConnection connection = null;

            try {
                URL url = new URL(PORT_URL);
                connection = (HttpsURLConnection) url.openConnection();
                connection.setRequestProperty("Accept-Encoding", "gzip");
                connection.connect();
                if (connection.getResponseCode() != HttpsURLConnection.HTTP_OK) {
                   Log.v("ERROR", "CONNECTION ERROR");
                }
                in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8"));
                String line;
                int lineNum = 0;
                while ((line = in.readLine()) != null) {
                    String[] data = line.split(",", -1);
                    Log.v("DATA", Arrays.toString(data) +" "+ lineNum);
                    if(data.length != 12) { continue; }
                    if(data == null) { continue; }
                    if(!data[2].equalsIgnoreCase("tcp")) { continue; }

                    String service = (data[0].equals(" ")) ? "null" : data[0];
                    int portNum = Integer.parseInt(data[1]);
                    String protocol = data[2];
                    String desc = data[3];
                    Log.v("PARSED", service +" "+ portNum +" "+ protocol +" "+ desc +" "+data.length);

                    long dbInsert = dbHelper.addTableRecord(service, portNum, protocol, service);
                }

            } catch (Exception e) {

            } finally {

            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... voids) {

        }

        @Override
        protected void onPostExecute(Void aVoid) {

        }
    }

}

DatabaseHelper класс

package org.pctechtips.netdroid.dbhelper;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;

/**
 * Created by jlvaz on 4/12/2017.
 * Database Helper file
 */


public class DatabaseHelper extends SQLiteOpenHelper {
    //The Android's default system path of your application database.
    private static String DB_PATH = "";
    private static String DB_NAME = "netdb.db";
    private static String TABLE_NAME = "ports";
    private static int DB_VERSION = 1;
    /*SQL Query to get service running on especific port*/
    private static String SQL_QUERY = "SELECT service FROM ports WHERE port==";
    private static String SQL_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (service TEXT, port INT(11), protocol TEXT, description TEXT);";
    private SQLiteDatabase mDataBase;
    private final Context context;

    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.     *
     * @param context
     */
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        DB_PATH = context.getDatabasePath(DB_NAME).getPath();
        this.context = context;
    }

    public void createDataBase() throws IOException {
        if(!checkDataBase()) {
            this.getReadableDatabase();
            copyDataBase();
            this.close();
        }
    }

    private boolean checkDataBase() {
        File DbFile = new File(DB_PATH + DB_NAME);
        return DbFile.exists();
    }

    boolean openDataBase() throws SQLException {
        mDataBase = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        return mDataBase != null;
    }

    public synchronized void close(){
        if(mDataBase != null)
            mDataBase.close();
        SQLiteDatabase.releaseMemory();
        super.close();
    }

    /**
     * create port table in netdb
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_TABLE);
    }

    /**
     * add record to port table on netdb
     * @param service
     * @param port
     * @param proto
     * @param desc
     * @return
     */
    public long addTableRecord(String service, int port, String proto, String desc) {
        ContentValues value = new ContentValues();
        value.put("service", service);
        value.put("port", port);
        value.put("protocol", proto);
        value.put("description", desc);
        return mDataBase.insert(TABLE_NAME, null, value);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    /**
     * copy database to app location
     * @throws IOException
     */
    private void copyDataBase() throws IOException {
        InputStream mInput =  context.getAssets().open(DB_NAME);
        String outfileName = DB_PATH;
        OutputStream mOutput = new FileOutputStream(outfileName);
        byte[] buffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(buffer))>0) {
            mOutput.write(buffer, 0, mLength);
        }
        mOutput.flush();
        mInput.close();
        mOutput.close();
    }

    /*
    * SQL query to get servive description
    * of especific port
    * */
    public String getPortService(int port) {
        String service = "";
        SQLiteDatabase db = this.getReadableDatabase();
        String sqlQuery = SQL_QUERY + port + ";";
        Cursor cursor = db.rawQuery(sqlQuery,null);
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            service = cursor.getString(0);
        }
        // make sure to close the cursor
        cursor.close();
        return (service != "")? service : "Unknown!";
    }

}
...